本文介绍在 javascript 中高效判断一个数组对象的某字段值(如 `vi_id`)是否存在于另一个数组对象的对应字段(如 `village_id`)中的方法,重点讲解 `array.prototype.some()` 的正确用法及常见误区。
在实际开发中,我们常需跨数组匹配对象属性——例如验证 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) 是在 arr2 的元素层级做全等比较(即比较对象引用),而 arr1[i].VI_ID 是一个数字(如 269292),它永远不会等于 arr2 中任一对象(如 { LOCALITIES_NAME: ‘…’, VILLAGE_ID: 269292 })。因此该条件恒为 false。
✅ 正确解法是使用 arr2.some() 配合箭头函数,对 arr2 中每个对象的 VILLAGE_ID 属性进行显式比对:
for (let i = 0; i item.VILLAGE_ID === arr1[i].VI_ID)) {
console.log(arr1[i].VILLAGES_NAME); // 输出:'Chozuba Vill.' 和 'Chozubasa (UR)'(因两者 VI_ID 均为 269292/269293?注意:本例中仅 269292 匹配)
}
}
✅ 输出结果:Chozuba Vill.(因 arr2 中两个对象的 VILLAGE_ID 均为 269292,仅匹配 arr1[0])
? 进阶推荐:使用 filter + some 实现更声明式、可复用的逻辑: