Как работает Object.entries()? Неожиданный вывод console.info

У меня есть объект объектов:

let obj = {
  a: {
    af: {
      key: "k", val: "v"
    },
    bf: {
      key: "g", val: "h"
    }
  },
  b: {
    af: {
      key: "f", val: "w"
    },
    nf: {
      key: "u", val: "t"
    }
  }
};`

Я пытаюсь получить массив всех значений, связанных с key, в данном случае: ["k","g","f","u"] Я пытался использовать Object.entries() в цикле for, но я не понимаю, как это работает. Я сделал просто как в документах:

for ([k,v] in Object.entries(obj)){
  console.info(k,v)
}

но мой результат

0 не определено

1 не определено

чего я совершенно не понимаю. Не могли бы вы помочь мне объяснить, как работает этот короткий код?

let obj = {a: {af: {key: "k", val: "v"}, bf: {key: "g", val: "h"}}, b: {af: {key: "f", val: "w"}, nf: {key: "u", val: "t"}}};

for ([k,v] in Object.entries(obj)){
  console.info(k,v)
}

🤔 А знаете ли вы, что...
JavaScript - это скриптовый язык программирования, разработанный Netscape Communications Corporation.


64
2

Ответы:

for-in перебирает ключи объекта, не включая значения. Object.entries() возвращает итератор, а не объект.

Используйте forEach() для повторения его результатов:

let obj = {a: {af: {key: "k", val: "v"}, bf: {key: "g", val: "h"}}, b: {af: {key: "f", val: "w"}, nf: {key: "u", val: "t"}}};

Object.entries(obj).forEach(([k, v]) => console.info(k, v));

Решено

Object.entries(obj) возвращает массив. Каждый элемент массива представляет одно свойство объекта, выраженное в виде массива, содержащего имя свойства и значение свойства.

x in someObject получает итерируемые имена свойств объекта.

Имена свойств в массиве являются числовыми индексами.

Следовательно, ваш вывод:

const [x,y] = "0";
console.info({x,y});

Если вы хотите перебирать значения свойств вместо имен свойств, вам нужен of (который перебирает значения), а не in.

let obj = {a: {af: {key: "k", val: "v"}, bf: {key: "g", val: "h"}}, b: {af: {key: "f", val: "w"}, nf: {key: "u", val: "t"}}};

for ([k,v] of Object.entries(obj)){
  console.info(k,v)
}

Однако цикл по массиву, вероятно, следует выполнять с помощью forEach (или традиционного цикла for из трех частей), поскольку он не споткнется о неожиданные перечисляемые свойства, которые могут быть добавлены к вашему массиву.

let obj = {a: {af: {key: "k", val: "v"}, bf: {key: "g", val: "h"}}, b: {af: {key: "f", val: "w"}, nf: {key: "u", val: "t"}}};

Object.entries(obj).forEach( ([k,v]) => console.info({k,v}) );