如何用Lodash根据指定Key找出数组间的差异元素(类似SQL NOT IN)
用Lodash实现类似SQL NOT IN的数组对象属性对比,返回完整元素
嘿,这个需求我平时处理数组操作时经常碰到,用Lodash的工具函数可以轻松搞定,核心思路就是先提取其中一个数组的目标属性值集合,再用这个集合去筛选另一个数组里不符合条件的元素。从你给出的例子和预期结果来看,我们需要找出arrayB中sku不在arrayA的sku集合里的元素(毕竟arrayA的所有sku都存在于arrayB中,反过来筛选的话结果会是空数组)。
实现步骤
- 第一步:提取
arrayA里所有的sku值,形成一个集合。用Lodash的_.map就能快速完成这个转换,它可以直接指定要提取的属性名。 - 第二步:遍历
arrayB,筛选出sku不在第一步得到的集合里的元素。这里用_.filter配合_.includes就能实现“NOT IN”的逻辑。
完整代码示例
const _ = require('lodash'); const arrayA = [ { sku:"1", name:"one"}, { sku:"2", name:"two"} ]; const arrayB = [ { sku:"1", name:"One Product"}, { sku:"2", name:"Two Product"}, { sku:"3", name:"Three Product"} ]; // 提取arrayA的sku集合 const aSkus = _.map(arrayA, 'sku'); // 筛选arrayB中sku不在aSkus中的元素 const result = _.filter(arrayB, item => !_.includes(aSkus, item.sku)); console.log(result); // 输出结果: [ { sku: '3', name: 'Three Product' } ]
性能优化小技巧
如果你的数组数据量比较大,把sku集合转换成Set会让筛选操作更高效——因为数组的_.includes是O(n)时间复杂度,而Set的has方法是O(1)的。优化后的代码如下:
const _ = require('lodash'); const arrayA = [ { sku:"1", name:"one"}, { sku:"2", name:"two"} ]; const arrayB = [ { sku:"1", name:"One Product"}, { sku:"2", name:"Two Product"}, { sku:"3", name:"Three Product"} ]; // 转换成Set提升查询性能 const aSkuSet = new Set(_.map(arrayA, 'sku')); const result = _.filter(arrayB, item => !aSkuSet.has(item.sku)); console.log(result);
这个逻辑完全对应SQL里的SELECT * FROM arrayB WHERE sku NOT IN (SELECT sku FROM arrayA),而且最终返回的是完整的对象,保留了所有字段,完美符合你的需求。
内容的提问来源于stack exchange,提问作者Martin Thompson
相关产品推荐
相关产品推荐

