将数组数组传递到 lodash 交集
Posted
技术标签:
【中文标题】将数组数组传递到 lodash 交集【英文标题】:Passing an array of arrays into lodash intersection 【发布时间】:2017-11-18 03:51:34 【问题描述】:我有一个包含对象的数组:
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)
我只是得到相同的结果。
有没有一种简单的方法可以将所有数组从数据传递到交集函数?我最初的想法是使用.map,但这会返回另一个数组...
【问题讨论】:
我不认为你会从中得到任何回报,因为我相信它是在比较参考,而不是价值。您应该改用intersectionBy
或intersectionWith
。
【参考方案1】:
你可以只 spread 数组。
intersection(...arrayOfarrays);
或者,在 ES6 之前的环境中,使用apply:
intersection.apply(null, arrayOfArrays);
或者,您可以将 intersect
转换为具有扩展参数的函数:
const intersectionArrayOfArrays = _.spread(_.intersection);
intersectionArrayOfArrays(arrayOfArrays);
请注意 lodash doesn't automatically work on arrays of objects 中的那个路口。
如果你想在属性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č 很高兴帮助drugar :) @nem035 感谢您添加对象数组交集的正确用法。但是,我会挑剔,并指出在您的intersectionWith
部分中,您说_.isEqual
通过引用比较对象,这是不正确的。 _.isEqual
进行深度对象属性值比较。
@mhodges 你是绝对正确的,感谢您指出这一点。固定。
您好,感谢@nem035 的回答:这真的让我很开心。
我试了_.intersection(...myArrayOfArrays)
,得到了[ts] Argument of type '' is not assignable to parameter of type 'ArrayLike<>'. Property 'length' is missing in type ''.
以上是关于将数组数组传递到 lodash 交集的主要内容,如果未能解决你的问题,请参考以下文章
Python计算两个numpy数组的交集(Intersection)实战:两个输入数组的交集并排序获取交集元素及其索引如果输入数组不是一维的,它们将被展平(flatten),然后计算交集