You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:22:00