【问题标题】:How to iterate over a dictionary of arrays (without knowing the key name)如何遍历数组字典(不知道键名)
【发布时间】:2019-09-03 16:11:23
【问题描述】:

我有一个类似这样的对象:

[
    {"key1": ["2019-04-12-14:54:29.190", "19", "0", "4325", "1"]},
    {"key2": ["2019-04-12-14:54:29.191", "20", "0", "2212", "1"]},
    {"key3": ["2019-04-12-14:54:29.192", "22", "0", "4376", "0"]}
]

但是我不知道键的名称(即我不知道 key1、key2 和 key3 的名称)。

这个post 几乎正是我想要的,除了那个方法需要你知道键名。

我需要能够遍历键名及其值数组。

我试过了:

for (var i in zk) {
    for (var j in zk[i]) {
        console.log(j)
    }
}

但这只会打印键名。我如何也可以遍历列表?在大多数语言中,迭代 j 似乎是合乎逻辑的选择,但在这种情况下并非如此。有任何想法吗?谢谢。

【问题讨论】:

  • zk[i][j] 是数组吗?但是你实际上应该改变你的数据结构,要么使用一个对象数组,要么使用一个带有键的对象进行查找,而不是两者兼而有之。
  • 您可以使用 for..of 来遍历值而不是键 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • thing.map(Object.values)thing.flatMap(Object.values)thing.flatMap(Object.values).flat() 取决于您想要的程度。

标签: javascript arrays object


【解决方案1】:

让我们从您提供的代码示例继续。

1) 获取每个元素的键

for (let i in zk) {
  for (let j in zk[i]) {
    console.log(j)
  }
}

2) 获取每个元素内的列表

for (let i in zk) {
  for (let j in zk[i]) {
    console.log(zk[i][j])
  }
}

3) 遍历每个元素中的每个列表

for (let i in zk) {
  for (let j in zk[i]) {
    for (let k = 0; k < zk[i][j].length; k++) {
      console.log(zk[i][j][k])
    }
  }
}

或者,您可以使用Object.values,它返回每个键值对的值。你也可以考虑使用Array.map()

for (let i in zk) {
  Object.values(zk[i]).map(list => {
    list.map(element => {
      console.log(element);
    });
  });
}

【讨论】:

    【解决方案2】:

    您错过了必须打印其值的对象

    for (var i in zk) {
        for (var j in zk[i]) {
            console.log(zk[i][j])
        }
    }
    

    【讨论】:

      【解决方案3】:

      问题是您缺少一级循环。您必须遍历外部数组,然后遍历每个对象中的键,然后如果该键的值是该数组上的数组循环。

      例如,如果您想记录所有值,则可以使用Object.prototype.keys(),它会返回对象中的键数组,因此您可以尝试以下操作:

      const arr = [
              {"key1": ["2019-04-12-14:54:29.190", "19", "0", "4325", "1"]},
              {"key2": ["2019-04-12-14:54:29.191", "20", "0", "2212", "1"]},
              {"key3": ["2019-04-12-14:54:29.192", "22", "0", "4376", "0"]}
          ];
      
          arr.forEach(x => {
            Object.keys(x).forEach(k => {
              if (Array.isArray(x[k])) {
                x[k].forEach(v => {
                  console.log(v);
                });
              } else {
                console.log(x[k]);
              }
            });
          });

      【讨论】:

        【解决方案4】:

        您可以采用不同的方法来迭代给定的数组和对象,使用

        var data = [{ key1: ["2019-04-12-14:54:29.190", "19", "0", "4325", "1"] }, { key2: ["2019-04-12-14:54:29.191", "20", "0", "2212", "1"] }, { key3: ["2019-04-12-14:54:29.192", "22", "0", "4376", "0"] }];
        
        data.forEach((object, outerIndex) =>
            Object.entries(object).forEach(([key, array]) => 
                array.forEach((value, innerIndex) => 
                    console.log(outerIndex, key, innerIndex, value)
                )
            )
        );
        .as-console-wrapper { max-height: 100% !important; top: 0; }

        【讨论】:

          【解决方案5】:

          在 js 中,你总是得到密钥,所以你要做的是:

          for (var i in zk) {
              for (var j in zk[i]) { // j wil ben key1, key2 ect
                  console.log(zk[i][j]); // arrays  ["2019-04-12-14:54:29.190", "19", "0", "4325", "1"] over where you can itterate
                  for (var k in zk[i][j]) {
                      console.log(zk[i][j][k]); // "2019-04-12-14:54:29.190" ect
                  }
              }
          }
          

          【讨论】:

            【解决方案6】:

            使用Object.values:

            const arr = [
                {"key1": ["2019-04-12-14:54:29.190", "19", "0", "4325", "1"]},
                {"key2": ["2019-04-12-14:54:29.191", "20", "0", "2212", "1"]},
                {"key3": ["2019-04-12-14:54:29.192", "22", "0", "4376", "0"]}
            ];
            
            arr.forEach(obj => console.log(Object.values(obj)));
            .as-console-wrapper { max-height: 100% !important; top: auto; }

            【讨论】:

              【解决方案7】:

              Object.entries 如果您尝试迭代并输出相应数组中的每个对象键和每个值,将会很有帮助。有更紧凑的方法可以做到这一点,但嵌套循环应该清楚地说明正在发生的事情。

              const arr = [
                {"key1": ["2019-04-12-14:54:29.190", "19", "0", "4325", "1"]},
                {"key2": ["2019-04-12-14:54:29.191", "20", "0", "2212", "1"]},
                {"key3": ["2019-04-12-14:54:29.192", "22", "0", "4376", "0"]}
              ];
              
              for (const obj of arr) {
                for (const [key, values] of Object.entries(obj)) {
                  console.log(`KEY: ${key}`);
                  console.log('VALUES: ');
                  for (const value of values) {
                    console.log(value);
                  }
                }
              }
              // Example output from first object...
              // KEY: key1
              // VALUES: 
              // 2019-04-12-14:54:29.190
              // 19
              // 0
              // 4325
              // 1

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-01-16
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-08-30
                相关资源
                最近更新 更多