如何用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; });
逻辑说明:
current.some(...)会遍历current,只要有一个元素让回调返回true,整个表达式就返回true;- 对每个
currentItem,用initial.find找到同ID的initialItem; - 同时满足“找到对应对象”和“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; });
逻辑说明:
initial.map(item => [item.id, item])把每个元素转成[id, 对象]的数组,再传入Map构造函数生成映射;- 遍历
current时,用initialMap.get(currentItem.id)直接获取对应ID的对象; - 同样判断“存在对应对象且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
相关产品推荐
相关产品推荐

