Как просто заполнить пустой массив данными в цикле?
Никак не могу понять как мне наполнить многомерный массив при переборе данных в 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 шт):
То, что в 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";