如何在JavaScript JSON对象数组中根据ID获取Name值(非遍历方式)
嘿,这个问题挺常见的!先给你澄清一个关键点:不存在完全不遍历数组的方法——因为数组是线性存储的,要定位到特定id的元素,不管是手动写循环还是用数组内置方法,底层都得逐个检查元素(除非你预先把数组转成更适合快速查找的结构,但转换过程还是要遍历一次)。不过我猜你说的“不遍历”是指不用手动写for/while循环对吧?那咱们来聊聊怎么用你提到的map、filter,还有更合适的方法来实现:
1. 用filter实现(但不是最优解)
filter会遍历整个数组,返回所有匹配条件的元素。如果你的数组里id是唯一的,那取返回数组的第一个元素就行:
const arr = [ {id:0, name:'A'}, {id:1, name:'B'}, {id:2, name:'C'} ]; const targetId = 1; const targetItem = arr.filter(item => item.id === targetId)[0]; const targetName = targetItem ? targetItem.name : '找不到对应ID';
⚠️ 注意:哪怕找到匹配项,filter还是会把整个数组遍历完,所以如果数组很大,效率会比较低。
2. 更高效的选择:用find(推荐单次查找)
find方法会遍历数组,找到第一个匹配条件的元素就立刻停止遍历,比filter高效得多,这应该是单次查找时的最优解:
const arr = [ {id:0, name:'A'}, {id:1, name:'B'}, {id:2, name:'C'} ]; const targetId = 1; const targetItem = arr.find(item => item.id === targetId); const targetName = targetItem?.name; // 可选链操作符,避免找不到时报错
3. 用map构建映射表(适合多次查找)
map本身不是用来直接查找元素的,但可以把数组转换成“id -> name”的键值对结构,之后再查找就不用遍历数组了(O(1)时间复杂度)。比如:
const arr = [ {id:0, name:'A'}, {id:1, name:'B'}, {id:2, name:'C'} ]; // 用map把数组转成[id, name]的二维数组,再转成对象 const idToName = Object.fromEntries(arr.map(item => [item.id, item.name])); // 之后查找直接通过id取值 const targetName1 = idToName[1]; // 输出 'B' const targetName2 = idToName[3]; // 输出 undefined(找不到时)
或者用Map结构,支持更灵活的键类型(比如数字、字符串以外的类型):
const idMap = new Map(arr.map(item => [item.id, item.name])); const targetName = idMap.get(1); // 输出 'B'
这种方式的好处是,第一次遍历构建映射后,后续不管查多少次都不用再遍历数组,适合需要多次根据id查name的场景。
最后总结一下
- 单次查找:优先用
find,高效且代码简洁。 - 多次查找:先通过
map(或reduce)构建对象/Map映射表,后续直接键访问。 filter可以实现,但效率较低,不推荐除非你需要获取所有匹配id的元素。
内容的提问来源于stack exchange,提问作者0x75aaa
相关产品推荐
相关产品推荐

