Вложенные Object.keys () являются свойствами печати несколько раз, а не только один раз - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть два объекта, которые мне нужно перебрать, чтобы я мог использовать их свойства позже. Однако, если я печатаю переменные, каждая из них печатается дважды. Я понимаю это, потому что у меня есть Object.keys() внутри другого Object.keys(). Есть ли способ перебрать эти два объекта и получить каждую переменную только один раз?

Мой код:

Object.keys(newData.name).map(async key => {
    Object.keys(newData._temp.images).map(async keyImage => {
        console.log(newData.name[key].name,'printed 2x instead of once');
        console.log(newData._temp.images[keyImage].rawFile.preview, 'printed 2x instead of once');
    });
});

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 07 ноября 2019

ваша логика вложения циклов неверна.

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

let nameKeys = Object.keys(newData.name).map(key => newData.name[key].name);
let imagesKeys = Object.keys(newData._temp.images).map(keyImage => 
                 newData._temp.images[keyImage].rawFile.preview);

теперь вы можете обращаться к nameKeys и imageKeys в любое время, и они будут содержать значения, которые вы ранее регистрировали. Мое название может быть немного неправильным, не стесняйтесь изменить это: D

Кроме того, как уже упоминалось, нет необходимости в ключевом слове async ... вы не выполняете никаких асинхронных операций внутри (пока,по крайней мере, если это то, что вы планируете, то продолжайте и сохраняйте это.

0 голосов
/ 07 ноября 2019

Эти итераторы не должны быть вложенными. Второй итератор не перебирает элемент первого итератора.

Object.keys(newData.name).forEach(key => {
    console.log(newData.name[key].name);
});
Object.keys(newData._temp.images).forEach(keyImage => {
    console.log(keyImage[keyImage].rawFile.preview);
});

Если вы заинтересованы только в выводе данных, тогда .map() не подходит для использования, потому что она используется, когда выо возвращаемом значении. Используйте .forEach(), если вы просто хотите пройтись по циклам.

Кроме того, здесь не нужно ключевое слово async, если только вы не планируете делать некоторые асинхронные / ожидающие вещи в циклах позже!

0 голосов
/ 07 ноября 2019

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

 const names = Object.keys(newData.name);
 const images = Object.keys(newData._temp.images);

for(let i = 0; i < Math.min(names.length, images.length); i++) {
  const name = names[i];
  const image = images[i];
  //...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...