1

次のようなJSONオブジェクトを含む配列があります

validTags = [{"tag":"tag1"}, {"tag":"tag2"}]; 

items = [{"id":123456, "tag":"tag1"}, {"id":123456, "tag":"tag2"}, {"id":7890, "tag":"tag1"}]; 

そして、最初の配列から両方の「タグ」を持つIDを見つけようとしています。

たとえば、出力は次のようになります。

[{"id":123456, "tag":"tag1 tag2"}]

一致する両方のタグが1つの文字列に結合されます。

これをどのように行うべきかについてのアイデアはありますか?最近、Javascriptチャットルームで一部のSOユーザーとチャットしていて、配列の共通部分を使用できると提案されましたが、JSONで意図した結果を得るためにこれをどのように使用するかは完全にはわかりません:(

すべての回答/ヘルプに感謝します!

どうもありがとう

4

3 に答える 3

3

javascriptには設定操作はありませんが、次のように簡単に定義できます。

intersection = function(a, b) {
    return a.filter(function(x) { return b.indexOf(x) >= 0 })
}

validTags特定のタスクについては、最初にリストに変換します。

vtags = validTags.map(function(x) { return x.tag }) 

次に、交点を計算し、各tag属性をitems配列に変換します。

results = items.filter(function(x) {
    return intersection(x.tag.split(/\s+/), vtags).length == vtags.length
})
于 2013-02-15T15:29:41.057 に答える
1

これはそれを行う必要があります:

var validTags = [{"tag":"tag1"}, {"tag":"tag2"}];
var items = [{"id":123456, "tag":"tag1"}, {"id":123456, "tag":"tag2"}, {"id":7890, "tag":"tag1"}]; 

var actualTags = validTags.map(function(obj){return obj.tag}),
    comparableTags = actualTags.sort().join(" ");

var tagsById = items.reduce(function(map, item) {
    if (item.id in map)
        map[item.id].push(item.tag);
    else
        map[item.id] = [ item.tag ];
    return map;
}, {});
var result = [];
for (var id in tagsById) {
    var tags = tagsById[id].sort().join(" ");
    if (comparableTags == tags) // Yai, array comparison by content!
        result.push({id: id, tag:tags});
}
return result;

アンダースコアを使用している場合は、 ;の代わりにpluckおよびのmap代わりに使用できます。要するに:groupByreduce

var comparableTags = _.pluck(validTags, "tag").sort().join(" ");
return _.chain(items).groupBy("id").map(function(id, tags) {
    return {id:id, tag:tags.sort().join(" ");
}.filter(function(obj) {
    return obj.tag == comparableTags;
}).value();
于 2013-02-15T15:27:42.900 に答える
1

オブジェクトと配列の両方を使用するソリューションは次のとおりです。

validTags = [{"tag":"tag1"}, {"tag":"tag2"}];
items = [{"id":123456, "tag":"tag1"}, {"id":123456, "tag":"tag2"}, {"id":7890, "tag":"tag1"}];

accumulate = {};
// Make use of the hashing of JavaScript objects to merge the tags.
items.forEach(function(e) {
  if(accumulate[e.id] == undefined) accumulate[e.id] = [e.tag];
  else accumulate[e.id].push(e.tag);
});

// Convert the object into an array. The field 'tags' is still an array.
var result0 = [];
for(var id in accumulate) result0.push({"id": id, tags: accumulate[id]});

var result = result0.filter(
  // First we cross out those do not contain every tag.
  function(e) { return validTags.every(
    function(e1) { return e.tags.indexOf(e1.tag) != -1; }); })
  // Then we make the 'tags' array into a string.
  .map(function(e) { return {"id": e.id, "tags": e.tags.join(" ")}; });
于 2013-02-15T16:05:04.820 に答える