本文介绍在 javascript 中高效判断一个数组对象的指定键值(如 `vi_id`)是否存在于另一个数组对象的对应键(如 `village_id`)中的方法,重点解析 `array.prototype.some()` 的正确用法及常见误区。
在处理嵌套对象数组时,常需跨数组匹配字段值。例如,arr1 存储村庄信息(含 VI_ID),arr2 存储属地信息(含 VILLAGE_ID),目标是:遍历 arr1,找出所有 VI_ID 在 arr2 中任一对象的 VILLAGE_ID 中存在的村庄名称。
你最初的写法:
for (let i = 0; i < arr1.length; i++) {
if (arr2.includes(arr1[i].VI_ID)) { // ❌ 错误:includes 比较的是整个对象,而非对象属性
console.log(arr1[i].VILLAGES_NAME);
}
}
失败原因在于:arr2.includes(value) 会尝试将 arr1[i].VI_ID(一个数字)与 arr2 中的整个对象进行全等比较,永远返回 false——因为数字不等于对象。
✅ 正确解法是使用 Array.prototype.some(),它对数组每一项执行测试函数,只要有一项返回 true,即整体返回 true:
for (let i = 0; i item.VILLAGE_ID === arr1[i].VI_ID)) {
console.log(arr1[i].VILLAGES_NAME); // 输出:'Chozuba Vill.' 和 'Chozubasa (UR)' 对应的名称?等等——注意实际匹配逻辑!
}
}
⚠️ 注意:根据你提供的数据,arr1[0].VI_ID === 269292,而 arr2 中两个对象的 VILLAGE_ID 均为 269292,因此仅 arr1[0](’Chozuba Vill.’)会命中;arr1[1].VI_ID === 269381 和 arr1[2].VI_ID === 269293 在 arr2 中均无匹配,不会输出。