【发布时间】:2016-02-25 21:00:38
【问题描述】:
我已经研究了几天,感觉这里缺少一个明显的实现。
(有关类似内容,请参阅 lodash Filter collection using array of values)。
我想要做的是收集用户已经拥有的项目,然后使用它从整个项目列表中进行过滤。有多种方法可以遍历列表并创建一个新集合并返回它,或者一种可能创建一个执行此操作的 mixin 的方法,但我很好奇是否只有一串单行代码或我的概念失踪。目标是对集合中的每个对象进行深度比较以确定等价性。
这是示例(此处为 jsFiddle:http://jsfiddle.net/kxLt534f/)
var collection = [
{id:1, name:'one'},
{id:2, name:'two'},
{id:3, name:'three'}
];
var filter = [
{id:2, name:'two'}
];
// what I want to be able to do
// var result = _.someFilterMethod(collection,filter);
// what it looks liked I'll have to do
var filtered = _.select(collection, function(c){
var same = false;
_.forEach(filter,function(f) {
same = _.isEqual(f,c);
});
return !same;
});
console.warn(filtered); // output is : [{id:1,name:'one',id:3,name:'three'}]
必须有更好的方法来做到这一点,但我一辈子都看不到它。任何建议将不胜感激!
【问题讨论】:
-
这是一个有趣的答案,我想我没有从交集的角度考虑它,尽管这是相反的。让我看一下,看看我是否可以拼凑一些东西,但最终似乎基于上述的 mixin 与他们在那里提出的答案相同。
-
预期输出是什么?你能举一个
filter数组中有多个项目的例子吗? -
抱歉耽搁了,感恩节在美国,所以我暂时避开了电脑。我将更新问题以更具体。
-
我把它留在这里是因为我认为这是一个很好的用例,有人可能会遇到,但它是更好的大 O 并且可能更有可能产生好的结果来创建一个 ID 数组使用采摘,然后过滤掉与该 ID 匹配的那些。缺点是其他人可能想要真正的深度比较。
标签: javascript collections filtering lodash