[英]looping over objects in an array inside an object (with for...in)
我在对象(数据)内的数组(组)中有对象(人),如下所示:
const data = {
g1 : [
{"name" : "Jack", "age" : 32},
{"name" : "Jill", "age" : 44}
],
g2 : [
{"email" : "jane@example.com", "city" : "Berlin", "age" : 14},
{"email" : "brad@example.com", "city" : "Stockholm", "age" : 22}
]
}
说我想console.log
所有年龄属性值,我尝试:
for (const group in data) {
for (const person of group) {
console.log(person.age)
}
}
这不起作用。 似乎for (const group in data)
只是循环它的孩子的名字。 我认为在这种情况下我不应该使用for...in
,但是我可以使用什么? 或者是否可以以某种方式使用for...in
?
我感到困惑的原因是因为在例如 PHP 中我可以这样做:
<?php
$data = [
"g1" => [
[ "name" => "Jack", "age" => 32 ],
[ "name" => "Jill", "age" => 44 ]
],
"g2" => [
[ "email" => "jane@example.com", "city" => "Berlin", "age" => 14 ],
[ "email" => "brad@example.com", "city" => "Stockholm", "age" => 22 ]
]
];
foreach ( $data as $group ) {
foreach ( $group as $person ) {
echo $person[ 'age' ];
}
}
并且在会工作。
一种更简单的方法是:
const data = { g1: [{ "name": "Jack", "age": 32 }, { "name": "Jill", "age": 44 } ], g2: [{ "email": "jane@example.com", "city": "Berlin", "age": 14 }, { "email": "brad@example.com", "city": "Stockholm", "age": 22 } ] }; console.log(Object.values(data).map(p => p.map(o => o.age)).flat());
for...in
构造只会为您提供对象的键,而不是它的值。 在你的外循环中:
for (const group in data) { ... }
...变量group
将设置为g1
,然后是g2
,而不是组的值。 要获取值(即人),您需要对组进行索引:
for (const group in data) {
for (const person of data[group]) {
console.log(person.age)
}
}
有一个更简单的方法:
const data = { g1 : [ {"name" : "Jack", "age" : 32}, {"name" : "Jill", "age" : 44} ], g2 : [ {"email" : "jane@example.com", "city" : "Berlin", "age" : 14}, {"email" : "brad@example.com", "city" : "Stockholm", "age" : 22} ] } Object.values(data).forEach(group=>group.forEach(person=>console.log(person.age)));
这是另一个版本:
const data = { g1 : [ {"name" : "Jack", "age" : 32}, {"name" : "Jill", "age" : 44} ], g2 : [ {"email" : "jane@example.com", "city" : "Berlin", "age" : 14}, {"email" : "brad@example.com", "city" : "Stockholm", "age" : 22} ] } Object.entries(data).forEach( group=>group[1].forEach( person=>console.log( group[0], person.name ? person.name : person.email, person.age) ) );
Object.entries 以数组形式返回对象中的属性和值列表,即 [[prop, val], [prop, val], ...]。
因此,如果您在其中使用 forEach,则 0 索引将是道具名称,而 1 索引将是值。 这解释了
Object.entries(data).forEach(
group=>group[1]
部分。 所以现在我们有了组名和 val ,它是一个人的数组。 然后你可以用另一个 forEach 迭代它并获得 age 属性:
[...]group[1].forEach(
person=>console.log(person.age));
我只是详细阐述了一下以获得更多相关信息
[...]group[1].forEach(
person=>console.log(
group[0],
person.name ? person.name : person.email,
person.age)
)
) [...]
这里的许多答案建议使用不同的方法,但没有解决您的问题,或者您的实施中缺少的内容要打印出来。
您缺少的是访问您迭代的group
的值。
尝试这个:
for (const group in data) {
for (const person of data[group]) {
console.log(person.age)
}
}
这将输出
32
44
14
22
让我们尝试一些干净和简单的东西。
const data = {
g1 : [
{"name" : "Jack", "age" : 32},
{"name" : "Jill", "age" : 44}
],
g2 : [
{"email" : "jane@example.com", "city" : "Berlin", "age" : 14},
{"email" : "brad@example.com", "city" : "Stockholm", "age" : 22}
]
}
consoleAllAges = obj => {
for (i in obj) {
const group = obj[i];
group.forEach(person => {
console.log(person.age);
});
}
}
您可以使用Object.values(data)
在一个数组中返回两个数组 g1 和 g2。 然后你想对这个数组使用flat()
,它会给你一个包含所有人的数组。 最后你想调用map()
来迭代这个数组。 由于p.age
隐式返回到map()
它将返回一个包含所有返回值的数组。
console.log(Object.values(data).flat().map(p=>p.age));
琴弦校正
g1 : [
{"name" : "Jack", "age" : 32},
{"name" : "Jill", "age" : 44}
],
g2 : [
{"email" : "jane@example.com", "city" : "Berlin", "age" : 14},
{"email" : "brad@example.com", "city" : "Stockholm", "age" : 22}
]
}
change string inside
group 是一个数组而不是一个对象。 而是试试这个
for (const group in data) {
for (const person of data[group]) {
console.log(person.age)
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.