【发布时间】:2015-07-10 18:38:13
【问题描述】:
这个问题专门针对 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,console,output
【问题讨论】:
-
您正在尝试根据用户和年龄查找重复项?
-
@CoryDanielson - 尝试根据用户和年龄属性查找匹配项。我将其称为匹配,而不是重复。
-
有趣的是,您的原始解决方案是迄今为止最快的。我认为如果其他人有重复,它可能会产生重复,但如果你在做
result.push(n)之后return false;应该没问题。 -
@CoryDanielson - 很高兴知道;你用什么进行性能测试?其他答案有更多的语法糖,但如果这个版本明显更快,我会继续这条路线。
-
jsperf.com/testingdiwq 我添加了更多数据,但如果您修剪
others,您将开始看到您和我之间的巨大差异。但这微不足道。无论解决方案如何,这一切都很快发生。必须平衡性能与干净的代码。干净的代码通常更好,因为大多数性能问题都与 DOM 相关
标签: javascript arrays lodash