这应该这样做:
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;
如果您使用的是Underscore,则可以使用pluck
代替map
andgroupBy
代替reduce
; 简而言之:
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();