比较两个数组并返回重复的值。

5

如何获取同一文档中存在于两个不同数组中的元素。

例如,在帖子集合中,文档具有字段“interestbycreator”和“interestbyreader”。每个字段都包含用户ID。

'interestbycreator':  //an array of ids here. IdA, idB, IdC, IdD, IdE,
'interestbyreader':  //an array of ids here. IdB, idE, iDF

基本上,我希望找到两个数组中都存在的所有id,这应该是IdB和IdE。

我能够使用underscore从数组中拔出所有值并将它们存储在一个变量中。可以用这种方式将它们彼此比较并返回重复项吗?或者有其他解决方案吗?

示例:检索'interestbyreader'中的所有ID。

var interestbypostcreater = Posts.find({_id: Meteor.user().profile.postcreated[0]}, {fields: {interestbyreader: 1}}).fetch();
var interestedReaderIds = _.chain(interestbypostcreator).pluck('interestbyreader').flatten().value();

假设我有另一个存储在变量interestIdcreator中的数组'interestbycreator',它们可以进行比较以查找重复项并返回这些重复项吗?

4
你考虑过使用_.intersection吗?http://underscorejs.org/#intersection - saimeunt
感谢您指出这一点。 - meteorBuzz
2个回答

19

As saimeunt said in the comments when you have access to underscore use intersection but you can also do it with plain javascript:

var x = ['IdA', 'idB', 'IdC', 'IdD', 'IdE'];
var y = ['idB', 'IdE', 'IdF'];

var z = x.filter(function(val) {
  return y.indexOf(val) != -1;
});

console.log(z);

数组z包含双倍的条目。
致谢https://dev59.com/7WUp5IYBdhLWcg3w8LB4#14930567

我怎样才能将“返回”结果存储到另一个变量中?我想将它们保存为数组而不是转换它们,这样我就可以使用该变量来查询数据库。谢谢您的帮助。 - meteorBuzz
1
你必须使用 slice() 函数进行源数组的深拷贝,例如:http://jsfiddle.net/94mjfhyh/ - Nick Russler
通过使用 set 进行查找,可以加快速度,但需要消耗一些内存。 - Nick Russler

11

就像Saimeunt所指出的那样,可以这样做:

var x = ['IdA', 'idB', 'IdC', 'IdD', 'IdE'];
var y = ['idB', 'IdE', 'IdF'];

var z = _.intersection(x, y);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接