lodash - 使用intersectionWith获取对象数组的交集会导致唯一性问题

时间:2017-09-21 19:54:08

标签: javascript arrays lodash

我正在尝试使用Lodash intersectWith通过某个属性交叉2个对象数组。

例如:

var objects = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];

// Intersect by objects with the same value for 'x'
_.intersectionWith(objects, others, (obj, oth) => obj.x === oth.x);

这样做,我只得到了一个对象的意外结果:

[{ x: 1, y: 1 }]

而不是整个第一个数组:

[{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]

由于某种原因,intersectionWith函数似乎只根据被比较的属性返回唯一结果。

任何人都可以解释为什么会这样吗?

2 个答案:

答案 0 :(得分:1)

关于_.intersection的Lodash文档:

  

创建一个包含在所有给定数组中的唯一值数组,使用SameValueZero进行相等比较。

_.intersectionWith

上的Lodash文档
  

此方法与_.intersection类似,只是它接受比较器,该比较器被调用以比较数组的元素。

这意味着您的比较器确定值的唯一性。通过仅比较x,您可以根据自定义比较器使所有对象实际上相同。

答案 1 :(得分:0)

也许你错过了_.intersection的一部分:

  

使用SameValueZero创建一个包含在所有给定数组中的 唯一值 数组,以进行相等比较。结果值的顺序和引用由第一个数组确定。 NS的[ 重点 ]

这意味着,如果您检查的值为x: 1,则结果集中不会再包含具有此值的对象。