这个问题具体到
lodash.
给定两个对象数组,使用另一个数组的对象过滤一个数组的最佳方式是什么?我试图在下面提出一个场景,我已经做了这样的方式是使用两个.forEach循环,但是我想知道如果使用lodash有一个更好的方式来进行这种类型的过滤.
例
对象的主要源数组是用户.
var users = [ { 'user': 'barney','age': 36,'active': true },{ 'user': 'joe','age': 40,'active': false },{ 'user': 'fred','age': 50,'age': 60,'age': 70,'age': 22,'age': 25,{ 'user': 'barney',{ 'user': 'pebbles','age': 1,'active': true } ];
将过滤用户数组的对象数组称为其他对象.
var others = [ { 'user': 'fred','age': 60 },'age': 70},'age': 22} ];
基于其他过滤用户的期望结果是:
[ { 'user': 'fred','active': false } ];
这是获得所需结果的一种方式.
var result = []; _.forEach(users,function (n,key) { _.forEach(others,function (n2,key2) { if (n.user === n2.user && n.age === n2.age) { result.push(n); } }); }); console.log(result);
解决方法
您可以索引其他人,然后获得所需的结果,而无需嵌套循环.它应该是一个相对有效的解决方案,不管数据量如何:
// index others by "user + age" var lookup = _.indexBy(others,function(o) { return o.user + o.age.toString() }); // find all users where "user + age" exists in index,one loop,quick lookup. no nested loops var result = _.filter(users,function(u) { return lookup[u.user + u.age.toString()] !== undefined; });
这样做结果相同:
[ { 'user': 'fred','active': false } ];
有趣的是,您原来的解决方案是所有这些答案中最具性价比的.
性能问题在这里可以忽略不计.在大多数情况下,DOM交互是前端的主要性能瓶颈.如果你要对付巨大的数据集并注意到锁定,那么你一定要通过使用for循环来进一步优化它,而不是用lodash函数来迭代….但是你通常不会遇到这样的数据JavaScript … sql和其他人会更好地处理它.