这个问题特定于lodash。
给定两个对象数组,用另一个数组的对象过滤一个数组的最佳方法是什么?我试图在下面提出一个方案,而我执行此操作的方式是使用两个.forEach
循环,但是我想知道是否使用lodash可以进行这种类型的过滤。
users
。
var users = [
{ 'user': 'barney', 'age': 36, 'active': true },
{ 'user': 'joe', 'age': 40, 'active': false },
{ 'user': 'fred', 'age': 50, 'active': false },
{ 'user': 'fred', 'age': 60, 'active': false },
{ 'user': 'fred', 'age': 70, 'active': false },
{ 'user': 'fred', 'age': 22, 'active': false },
{ 'user': 'fred', 'age': 25, 'active': false },
{ 'user': 'barney', 'age': 40, 'active': false },
{ 'user': 'pebbles', 'age': 1, 'active': true }
];
将过滤该数组的对象users
数组称为others
。
var others = [
{ 'user': 'fred', 'age': 60 },
{ 'user': 'fred', 'age': 70},
{ 'user': 'fred', 'age': 22}
];
基于others
过滤的预期结果users
是:
[
{ 'user': 'fred', 'age': 60, 'active': false },
{ 'user': 'fred', 'age': 70, 'active': false },
{ 'user': 'fred', 'age': 22, '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);
这是jsbin上的示例。
http://jsbin.com/hapariviya/1/edit?html,js,控制台,输出
您可以索引其他索引,然后获得所需的结果而不必嵌套循环。无论数据量如何,它都应该是一个相对有效的解决方案:
// index others by "user + age"
var lookup = _.keyBy(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', 'age': 60, 'active': false },
{ 'user': 'fred', 'age': 70, 'active': false },
{ 'user': 'fred', 'age': 22, 'active': false }
];
有趣的是,您的原始解决方案是所有这些答案中性能最高的。
在这里,性能问题可以忽略不计。在大多数情况下,DOM交互是前端的主要性能瓶颈。如果要对庞大的数据集运行此操作并注意到锁定,您肯定希望通过使用for循环而不是用lodash函数进行迭代来对其进行进一步优化....但是通常不会在其中遇到此类数据JavaScript ... SQL和其他人会更好地处理它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句