【问题标题】:lodash filter collection by other collection其他集合的 lodash 过滤器集合
【发布时间】: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


【解决方案1】:

函数 _.intersectionWith 是在 lodash 4.0 中添加的,它应该完全符合您的要求。按如下方式使用:

var collection = [
    {id:1, name:'one'},
    {id:2, name:'two'},
    {id:3, name:'three'}
];

var filter = [
    {id:2, name:'two'}
];


// _.isEqual performs a deep comparison
_.intersectionWith(collection, filter, _.isEqual) // [{"id":2,"name":"two"}]

【讨论】:

  • 完美!谢谢你
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2013-06-19
  • 2019-01-22
  • 2021-02-21
  • 2015-04-06
相关资源
最近更新 更多