如何在JavaScript或Lodash中基于前两个键比较并返回不等元素索引
基于a、b键比较元素并获取第一个不匹配索引的实现
没问题,这需求挺常见的,我给你准备了原生JavaScript和Lodash两种实现方案,你可以根据项目情况灵活选择:
原生JavaScript实现
这种方式不需要依赖任何库,用原生数组方法就能搞定。核心思路是用findIndex遍历数组,逐一比对对应索引元素的a和b键值:
// 示例数据(模拟你的场景) const array1 = [{a: 1, b: 2}, {a: 3, b: 4}]; const array2 = [{a: 1, b: 5}, {a: 3, b: 4}]; const getFirstMismatchIndex = (arrA, arrB) => { return arrA.findIndex((currentItem, index) => { const targetItem = arrB[index]; // 处理其中一个数组长度更短的边界情况 if (!targetItem) return true; // 比较a和b两个键的值,只要有一个不等就返回当前索引 return currentItem.a !== targetItem.a || currentItem.b !== targetItem.b; }); }; // 执行测试 console.log(getFirstMismatchIndex(array1, array2)); // 输出:0,完全符合你的示例需求
如果所有元素的a和b都匹配,函数会返回-1,你可以根据业务需求调整这个默认返回值。
Lodash实现
如果你的项目已经在用Lodash,利用它的工具方法能让代码更简洁,尤其是当a/b的值是对象、数组这类复杂类型时,深度比较会更稳妥:
const _ = require('lodash'); // 同样用示例数据 const array1 = [{a: 1, b: 2}, {a: 3, b: 4}]; const array2 = [{a: 1, b: 5}, {a: 3, b: 4}]; const getFirstMismatchIndex = (arrA, arrB) => { return _.findIndex(arrA, (currentItem, index) => { const targetItem = arrB[index]; if (!targetItem) return true; // 提取两个元素的a、b键,再用isEqual做深度比较 return !_.isEqual(_.pick(currentItem, ['a', 'b']), _.pick(targetItem, ['a', 'b'])); }); }; // 执行测试 console.log(getFirstMismatchIndex(array1, array2)); // 输出:0
_.pick帮我们精准提取需要比较的键,_.isEqual则能处理复杂数据类型的深层比对,比原生的===适用性更强。
内容的提问来源于stack exchange,提问作者Gautham Shetty
相关产品推荐
相关产品推荐

