Как перебрать словарь массивов (не зная имени ключа) - PullRequest
1 голос
/ 12 апреля 2019

У меня есть объект, который выглядит примерно так:

[
    {"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 мне неизвестны).

Эта запись - почти то, что я хочу, за исключением того, что метод требует, чтобы вы знали имена ключей.

Мне нужно иметь возможность перебирать имя ключа иэто массив значений.

Я пробовал это:

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

Но это только печатает имена ключей.Как я могу перебрать список?В большинстве языков итерация по j кажется логичным выбором, но не в этом случае.Есть идеи?Спасибо.

Ответы [ 7 ]

3 голосов
/ 13 апреля 2019

Давайте продолжим с предоставленного вами примера кода.

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 голосов
/ 13 апреля 2019

Вы можете использовать другой подход для итерации заданных массивов и объектов, используя

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; }
1 голос
/ 13 апреля 2019

Проблема в том, что вам не хватает одного уровня вашего цикла.Вы должны зациклить внешний массив, затем зациклить ключи в каждом объекте, а затем, если значение этого ключа является зацикливанием массива над этим массивом.

Если, например, вы хотите записать все значения, вы можете использовать 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]);
        }
      });
    });
1 голос
/ 13 апреля 2019

Вы пропустили объект, значение которого должно быть напечатано

for (var i in zk) {
    for (var j in zk[i]) {
        console.log(zk[i][j])
    }
}
0 голосов
/ 13 апреля 2019

Использование 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; }
0 голосов
/ 13 апреля 2019

В 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
        }
    }
}
0 голосов
/ 13 апреля 2019

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...