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

如何用Lodash方法检测两个对象数组中同ID属性值是否不匹配?

解决方案

问题分析

你需要判断current数组中是否存在与initial同ID但value不同的对象,只要有一个满足就返回true,否则返回false。你之前的代码问题在于:

  • 如果是原生Array.some,语法错误,原生some的第一个参数必须是回调函数,不能直接传匹配对象;
  • 如果是Lodash的_.some,value: !item.value是对item.value取布尔反,不是对比“值不同”的逻辑,逻辑错误。

方法一:原生数组方法(直观但小数据量适用)

直接用Array.some遍历current,对每个元素在initial中找到对应ID的对象,然后对比value:

const hasDifferentValue = current.some(currentItem => {
  const initialItem = initial.find(item => item.id === currentItem.id);
  // 确保找到对应ID的对象,且value不同
  return initialItem && initialItem.value !== currentItem.value;
});

逻辑说明:

  1. current.some(...)会遍历current,只要有一个元素让回调返回true,整个表达式就返回true;
  2. 对每个currentItem,用initial.find找到同ID的initialItem;
  3. 同时满足“找到对应对象”和“value不相等”时,返回true。

方法二:用Map优化性能(大数据量推荐)

如果数组元素较多,先把initial转成以id为键的Map,这样查找对应元素的时间复杂度从O(n)降到O(1):

// 先把initial转成Map,key是id,value是对应的对象
const initialMap = new Map(initial.map(item => [item.id, item]));

const hasDifferentValue = current.some(currentItem => {
  const initialItem = initialMap.get(currentItem.id);
  return initialItem && initialItem.value !== currentItem.value;
});

逻辑说明:

  1. initial.map(item => [item.id, item])把每个元素转成[id, 对象]的数组,再传入Map构造函数生成映射;
  2. 遍历current时,用initialMap.get(currentItem.id)直接获取对应ID的对象;
  3. 同样判断“存在对应对象且value不同”,满足则返回true。

测试示例

用你给出的示例数据测试:

const initial = [
    { id: '1', value: '1' },
    { id: '2', value: '2' }
];
const current = [
    { id: '1', value: '3' },
    { id: '2', value: '2' }
];

// 两种方法都会返回true
console.log(hasDifferentValue); // true

如果current的所有元素value都和initial一致,则返回false。


内容的提问来源于stack exchange,提问作者natalia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 20:15:33