繁体   English   中英

在对象内的数组中循环对象(使用 for...in)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM