如何遍历数组字典(不知道键名)

时间:2019-04-12 20:59:52

标签: javascript arrays object

我有一个看起来与此类似的对象:

[
    {"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似乎是逻辑选择,但在这种情况下不是。有任何想法吗?谢谢。

7 个答案:

答案 0 :(得分:2)

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

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);
    });
  });
}

答案 1 :(得分:2)

您可以采用另一种方法来迭代给定的数组和对象,

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; }

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

例如,如果要记录所有值,则可以使用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 :(得分:0)

如果您尝试迭代并输出对应数组中的每个对象键和每个值,那么

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 (let obj of arr) {
  for (let [key, values] of Object.entries(obj)) {
    console.log(`KEY: ${key}`);
    console.log('VALUES: ');
    for (let 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

答案 5 :(得分:0)

在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 :(得分:0)

使用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; }