无法找到对象数组中匹配对象的索引的技术问题求助
问题解决:匹配对象并获取索引
为什么你的方法失效
直接用
===比较对象:JavaScript里对象是引用类型,===比的是两个对象的内存地址,不是内容。哪怕两个对象键值完全一样,只要不是同一个引用,结果就是false,所以第一个方法根本找不到匹配项。JSON.stringify的问题:你提供的data里第三个variant的extraField有个末尾逗号("Material": "Rubber",),虽然JS允许对象属性末尾加逗号,但JSON.stringify处理这种不符合JSON规范的结构时,生成的字符串可能和正常对象的不一样;另外,JSON.stringify的属性顺序依赖对象属性的创建顺序,要是两个对象属性顺序不同,哪怕内容一致,也会得到不同的字符串。
正确的解决方案
方法1:自定义深度比较函数
写个递归函数,逐个比较两个对象的键值对,确保内容完全一致:
function isEqual(obj1, obj2) { // 引用相同直接返回true if (obj1 === obj2) return true; // 类型不一致或为空直接返回false if (typeof obj1 !== 'object' || obj1 === null || typeof obj2 !== 'object' || obj2 === null) { return false; } // 键的数量不同直接不匹配 const keys1 = Object.keys(obj1); const keys2 = Object.keys(obj2); if (keys1.length !== keys2.length) return false; // 遍历每个键,递归比较对应的值 for (const key of keys1) { if (!keys2.includes(key) || !isEqual(obj1[key], obj2[key])) { return false; } } return true; } // 用findIndex快速获取索引 const index = data.variants.findIndex(item => isEqual(item.extraField, obj)); console.log(index); // 输出0
方法2:修复JSON.stringify的问题
如果非要用JSON.stringify,得先处理对象的无效逗号,再统一属性顺序:
// 按键排序后再stringify,避免属性顺序影响结果 function stringifySorted(obj) { return JSON.stringify(Object.keys(obj).sort().reduce((sorted, key) => { sorted[key] = obj[key]; return sorted; }, {})); } let index = null; for (let l = 0; l < data.variants.length; l++) { // 先自动去除对象里的末尾逗号 const cleanedField = JSON.parse(JSON.stringify(data.variants[l].extraField)); if (stringifySorted(cleanedField) === stringifySorted(obj)) { index = l; break; // 找到就跳出循环,不用继续遍历 } } console.log(index); // 输出0
方法3:用lodash的isEqual(如果允许引入第三方库)
如果项目里已经有lodash,直接用它的深度比较方法,省事又靠谱:
const index = data.variants.findIndex(item => _.isEqual(item.extraField, obj)); console.log(index); // 输出0
内容的提问来源于stack exchange,提问作者Akash Sinha
相关产品推荐
相关产品推荐

