JavaScript中遍历对象数组:如何循环获取所有地址?
嘿,我来帮你把这个问题拆解清楚,一步步搞懂执行流程,再解决获取所有address的问题~
先搞懂你现有代码的执行流程
首先,Object.entries(name)这个方法的作用是把对象的键值对转换成二维数组。针对你定义的name对象:
const name = { john: [ { age: 21, address: 'LA', } ], sam: [ { age: 26, address: 'California' } ] };
Object.entries(name)会返回这样的数组:
[ ["john", [{ age: 21, address: 'LA' }]], ["sam", [{ age: 26, address: 'California' }]] ]
你的for循环是遍历这个二维数组的每一项:
- 当
i=0时,array[i]就是["john", [{ age: 21, address: 'LA' }]],所以console.log会输出这个数组 - 当
i=1时,array[i]就是["sam", [{ age: 26, address: 'California' }]],输出这个数组
这就是你现有代码的执行逻辑,它只是把每个键和对应的数组打印出来,还没深入到数组里的对象去取address。
如何循环获取所有address值
因为每个键对应的是一个数组(哪怕里面只有一个对象),所以需要嵌套遍历:先遍历外层的键值对数组,再遍历每个键对应的对象数组,最后取出address属性。
方法1:用你熟悉的for循环改造
const name = { john: [ { age: 21, address: 'LA', } ], sam: [ { age: 26, address: 'California' } ] }; const array = Object.entries(name); for (let i = 0; i < array.length; i++) { // 取出当前键对应的对象数组(比如array[i][1]就是john对应的[{age:21, address:'LA'}]) const personList = array[i][1]; // 遍历这个数组里的每个对象 for (let j = 0; j < personList.length; j++) { // 取出address并打印 console.log(personList[j].address); } }
执行后会依次输出LA和California。
方法2:更简洁的forEach嵌套写法
如果觉得嵌套for循环有点繁琐,可以用forEach来简化:
const name = { john: [ { age: 21, address: 'LA', } ], sam: [ { age: 26, address: 'California' } ] }; // 遍历每个键值对,用解构直接拿到key和对应的对象数组 Object.entries(name).forEach(([key, personList]) => { // 遍历对象数组里的每个person personList.forEach(person => { console.log(person.address); }); });
方法3:收集所有address到一个数组里
如果想把所有address存到一个新数组里,而不是直接打印,可以用Object.values+flatMap:
const name = { john: [ { age: 21, address: 'LA', } ], sam: [ { age: 26, address: 'California' } ] }; // Object.values(name)直接获取所有对象数组,flatMap扁平化并取出address const allAddresses = Object.values(name).flatMap(personList => personList.map(person => person.address) ); console.log(allAddresses); // 输出 ["LA", "California"]
这样不管你的对象里有多少个键,每个键对应的数组里有多少个对象,都能轻松拿到所有address啦~
内容的提问来源于stack exchange,提问作者Lend Sham
相关产品推荐
相关产品推荐

