Как перебрать многомерный массив на JS с помощью foreach?
Извините за глупый вопрос, запутался в синтаксисе.
Хочу перебрать многомерный массив с кучей вложений, пример:
Array(50)
0: {ID: "46998", IBLOCK_ID: "36", NAME: "Toyota", IBLOCK_SECTION_ID: null, CREATED_BY: "12", PROPERTY_152: {213156: "9284"}}
1: {ID: "47000", IBLOCK_ID: "36", NAME: "Toyota", IBLOCK_SECTION_ID: null, CREATED_BY: "12", PROPERTY_152: {213162: "9284"}}
2: {ID: "47002", IBLOCK_ID: "36", NAME: "Toyota", IBLOCK_SECTION_ID: null, CREATED_BY: "12", PROPERTY_152: {213170: "9284"}}
3: {ID: "47004", IBLOCK_ID: "36", NAME: "Toyota", IBLOCK_SECTION_ID: null, CREATED_BY: "12", PROPERTY_152: {213180: "9284"}}
4: {ID: "47006", IBLOCK_ID: "36", NAME: "Toyota", IBLOCK_SECTION_ID: null, CREATED_BY: "12", PROPERTY_152: {213192: "9934"}}
Таким способом перебираю его в PHP и вывожу в таблицу (вывожу значение одной переменной, просто для примера):
<?php
$id_K = $_REQUEST['PLACEMENT_OPTIONS'];
$id_K = preg_replace("/[^0-9]/", '', $id_K);
$id_E = $v2['ID'];
foreach ((array) $result as $k=>$v){
foreach ((array) $v as $k2=>$v2){
foreach ((array) $v2 as $k3=>$v3){
foreach ((array) $v3 as $k4=>$v4){
if ($v4==$id_K)
echo '<tr>
<td><strong>'.'1'.'</strong></td>'
.'<td>'.$v2['ID'].'</td>'
.'<td>'.$v2['NAME'].'</td>'
.'<td>'.$v2['NAME'].'</td>'
.'<td>'.$v2['NAME'].'</td>'
.'<td>'.$v2['NAME'].'</td>'
.'<td>'.$v2['NAME'].'</td>
</tr>'; }}}} ?>
Как мне подобное повторить на JS? Пытаюсь сделать так:
Массив находится в переменной listTech
for(var i = 0; i < listTech.length; i++)
{
var tr = document.createElement('tr');
tr.innerHTML =
'<td>' + listTech[i].ID + '</td>' +
'<td>' + listTech[i].NAME + '</td>' +
'<td>' + listTech[i].PROPERTY_152[0] + '</td>' +
'<td>' + listTech[i] + '</td>' +
'<td>' + listTech[i] + '</td>' +
'<td>' + listTech[i] + '</td>';
tbody.appendChild(tr);
}
В принципе, я его уже перебрал разными способами. Но интересует вопрос, как мне получить доступ к значению вложенного массива PROPERTY_152, если ключи в этом массиве не повторяются? Как написать, что я хочу получить значение по индексу 0 из массива PROPERTY_152? listTech[i].PROPERTY_152значение 0 индекса
Ответы (1 шт):
Если без парсинга того формата данных который указан в вопросе (предполагая что скрипт уже распарсил данные в js-массив и поместил результат в переменную listTech), то код добавления ячеек таблицы с перебором через forEach будет примерно таким:
const tBody = document.querySelector('#your-table tbody');
listTech.forEach(item => {
const tr = tBody.insertRow();
tr.insertCell().textContent = item.ID;
tr.insertCell().textContent = item.NAME;
tr.insertCell().textContent = Object.values(item.PROPERTY_152)[0]; // получаем значение первого свойства вложенного объекта в свойстве `PROPERTY_152`
for (let i = 0; i < 3; ++i) // добавляем три пустых ячейки, как и код в вопросе
tr.insertCell();
});
Но интересует вопрос, как мне получить доступ к значению вложенного массива PROPERTY_152, если ключи в этом массиве не повторяются?
Значением свойства PROPERTY_152 является объект, а не массив.
Обратиться к первому свойству объекта можно либо по имени этого свойства (когда оно известно), либо получив список всех значений свойств в виде массива и взяв значение его нулевого элемента:
Object.values(listTech[i].PROPERTY_152)[0]
Но когда в объекте может быть несколько свойств, полагаться на порядок их следования не стоит (сохранение этого порядка не гарантируется) - лучше считывать значение свойства по его имени.