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

Никак не могу понять как мне наполнить многомерный массив при переборе данных в JS так же просто как в PHP. Там я это делал одной строке в цикле, независимо от данных, которые у меня есть до перебора.

$newArray = [] // пусто

foreach ($item as $item) {

    $newArray[$item['param1']][$item['param2']][$item['param3']][] = $item['param4'] 

}

На выходе готовый массив. JS же уже весь мозг вынес со своими undefined

такая вложенность получается

[
    [param1] => [
        [param2] => [
            [param3] => [
                [0] => param4
                [1] => param4
            ],
            [param3] => [
                [0] => param4
            ],
        ],
        [param2] => [
            [param3] => [
                [0] => param4
            ],
        ],
    ],
    ....
]

Есть ли какое то простое решение?


Ответы (1 шт):

Автор решения: DiD

То, что в PHP называется массивами, в JSON делится на две части: массивы [] и объекты {}. Массив - это такая коллекция элементов, где для доступа к элементам используется порядковый номер (индекс) элемента. Объект - это такая коллекция элементов, где для доступа к элементам используется строковое имя (свойство объекта) элемента. В PHP и то и другое - есть массивы. Поэтому, в JS массивы и объекты управляются немного по-разному.

Аналогом циклов PHP

foreach($array as $item){ 
  /* Тут в $array будет ссылка на массив
         в $item будет копия текущего элемента */
}

foreach($array as $index => $item){ 
  /* Тут в $array будет ссылка на массив
         в $index будет индекс или ключ элемента
         в $item будет копия текущего элемента */
}

в JS будет для массивов:

for(const item of array){
  /* Тут в array будет ссылка на массив
         в item будет ссылка на текущий элемент */
}

for(const [index, item] of array.entries()){
  /* Тут в array будет ссылка на массив
         в item будет ссылка на текущий элемент 
         в index будет индекс элемента */
}

и для объектов:

for(const [propertyKey, propertyValue] of Object.entries(object)){
  /* Тут в object будет ссылка на объект
         в propertyKey будет название текущего свойства
         в propertyValue будет значение текущего свойства */
}

Приведу пример. Чтобы создать объект со структурой JSON как здесь:

{"menu": {
  "id": "file",
  "value": "File",
  "popup": {
    "menuitem": [
      {"value": "New", "onclick": "CreateNewDoc()"},
      {"value": "Open", "onclick": "OpenDoc()"},
      {"value": "Close", "onclick": "CloseDoc()"}
    ]
  }
}}

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

const header = {"menu": {
  "id": "file",
  "value": "File",
  "popup": {
    "menuitem": [
      {"value": "New", "onclick": "CreateNewDoc()"},
      {"value": "Open", "onclick": "OpenDoc()"},
      {"value": "Close", "onclick": "CloseDoc()"}
    ]
  }
}}

Либо, если json находится в строке, можно использовать JSON.parse()

const header = JSON.parse('{"menu":{"id":"file","value":"File",\
"popup":{"menuitem":[{"value":"New","onclick":"CreateNewDoc()"},\
{"value":"Open","onclick":"OpenDoc()"},\
{"value":"Close","onclick":"CloseDoc()"}]}}}')

Либо, если генерировать объект частями, формально эквивалентно предыдущим вариантам будет такой:

const header = {};
header.menu = {};
header.menu.id = "file";
header.menu.value = "File";
header.menu.popup = {};
header.menu.popup.menuitem = [];
header.menu.popup.menuitem[0] = {};
header.menu.popup.menuitem[0].value = "New";
header.menu.popup.menuitem[0].onclick = "CreateNewDoc()";
header.menu.popup.menuitem[1] = {};
header.menu.popup.menuitem[1].value = "Open";
header.menu.popup.menuitem[1].onclick = "OpenDoc()";
header.menu.popup.menuitem[2] = {};
header.menu.popup.menuitem[2].value = "Close";
→ Ссылка