Как пройтись одним циклом в многоуровневом объекте?

Рейтинг: 0Ответов: 1Опубликовано: 06.04.2023

Как пройтись одним циклом в многоуровневом объекте?

Прошу прощения за рандомный набор букв в названии переменных в let.

А как правильно и эстетично именовать такие переменные в многоуровневых циклах?

let obj = {
  0: {
    0: {
      0: {
        0: {
          0: {
            id: 11,
            decimal: 3
          },
          // еще значения...
        },
       // еще значения...
      },
      // еще значения...
    },
    // еще значения...
  },
  // еще значения...
};

for (let i in obj) {
  for (let j in obj[i]) {
    for (let y in obj[i][j]) {
      for (let a in obj[i][j][y]) {
        for (let n in obj[i][j][y][a]) {
          console.log(obj[i][j][y][a][n].id, obj[i][j][y][a][n].decimal);
        }
      }
    }
  }
}

Ответы

▲ 0Принят

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

Создадим функцию, которая будет вызывать сама себя, если структура объекта ниже не содержит заданных нам значений

let obj = {
  0: {
    0: {
      0: {
        0: {
          0: {
            id: 11,
            decimal: 3
          },
        },
      },
      1: {
        id: 12,
        decimal: 4
      },
    },
  },
  1: {
    id: 14,
    decimal: 5
  },
};

const logObj = (data) => {
  for (let i in data) {
    if (typeof data[i] === 'object' && !data[i].id) {
      logObj(data[i]);
    } else {
      console.log(data[i].id, data[i].decimal)
    }
  }
}

logObj(obj);

Если структура сложнее, то можно добавить дополнительные проверки