
本文介绍在 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 < arr1.length; i++) {
if (arr2.some(item => 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 中均无匹配,不会输出。
本文档主要讲述的是j2me3D游戏开发简单教程; 如今,3D图形几乎是任何一部游戏的关键部分,甚至一些应用程序也通过用3D形式来描述信息而获得了成功。如前文中所述,以立即模式和手工编码建立所有的3D对象的方式进行开发速度很慢且很复杂。应用程序中多边形的所有角点必须在数组中独立编码。在JSR 184中,这称为立即模式。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
? 进阶推荐:使用 map + filter 实现更函数式、可读性更强的写法:
const matchedVillages = arr1
.filter(village =>
arr2.some(locality => locality.VILLAGE_ID === village.VI_ID)
)
.map(village => village.VILLAGES_NAME);
console.log(matchedVillages); // ['Chozuba Vill.']? 总结要点:
- includes() 适用于原始值数组(如 [1,2,3])或精确对象引用比较,不适用于按属性查找;
- some() 是跨对象属性匹配的首选,语义清晰、性能良好(找到即终止);
- 若需高频匹配(如大数据量),建议预先构建 Set 索引提升效率:
const villageIdSet = new Set(arr2.map(item => item.VILLAGE_ID)); for (const village of arr1) { if (villageIdSet.has(village.VI_ID)) { console.log(village.VILLAGES_NAME); } }
掌握这些模式,可稳健应对各类数组间字段关联校验场景。









