将一个数组的数组传递到lodash交集函数中

10

我有一个包含对象的数组数组:

let data = [[{a:0}, {b:1}], [{a:1}, {b:1}]]

现在我想要使用Lodash intersection来比较这两个数组,返回[{b:1}]

当我执行以下操作时:

import {intersection} from 'lodash'

return intersection([{a:0}, {b:1}], [{a:1}, {b:1}])

结果是正确的。

但是当我这样做时

return intersection(data)

我只是得到相同的结果。

有没有一种简单的方法将data中的所有数组传递给intersection函数? 我最初的想法是使用.map,但这会返回另一个数组...


我认为你不会从中得到任何东西,因为它比较的是引用而不是值。你应该使用 intersectionByintersectionWith - mhodges
1个回答

18
你可以只需扩展数组。
intersection(...arrayOfarrays);

或者,在ES6之前的环境中,使用apply

intersection.apply(null, arrayOfArrays);

或者,您可以将intersect转换为一个具有扩展参数的函数:

const intersectionArrayOfArrays = _.spread(_.intersection);
intersectionArrayOfArrays(arrayOfArrays);

请注意,lodash中的交集不会自动处理对象数组

如果您想在属性b上求交集,可以使用intersectionBy函数:

const arrayOfArrays = [[{a:0}, {b:1}], [{a:1}, {b:1}]];
console.log(
  _.intersectionBy(...arrayOfArrays, 'b')
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

或者 intersectionWith,如果您想通过引用或深度比较在相同的对象上进行交集操作:

const a1 = {a: 0};
const a2 = {a: 1};
const b = {b: 1};
const arrayOfArrays = [[a1, b], [a2, b]];

// reference comparison
console.log(
  _.intersectionWith(...arrayOfArrays, (a, b) => a === b)
)

// deep equality comparison
console.log(
  _.intersectionWith(...arrayOfArrays, _.isEqual)
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>


@MihaŠušteršič 很高兴能帮助你,朋友 :) - nem035
@nem035 感谢您添加正确的对象数组交集用法。然而,我想指出,在您的intersectionWith部分中,您说_.isEqual通过引用比较对象,这是不正确的。_.isEqual实际上进行深度对象属性值比较。 - mhodges
1
@mhodges,你说得完全正确,感谢指出。已修复。 - nem035
你好,感谢 @nem035 的回答:它真的让我开心。 - smonff
Janac的解决方案是有效的,但对于那些在代码库中没有使用any的人来说,您可以将数组转换为myArrayOfArrays: YourArrayType[][] - Chukwuemeka Inya
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接