Пройдите по вложенному массиву, используя индекс в JavaScript

#javascript #multidimensional-array

Вопрос:

Я хочу пройти через вложенный массив и должен найти целевой элемент в массиве. Пример пути [2, 1] должен вернуться {text: 'More 2'} , и путь [2, 2, 1] должен вернуться { text: 'Other-2' } . Я попробовал функции lodash, но пока безуспешно. Мой вложенный массив приведен ниже:

 var data = [
  { text: 'Item 1', },
  { text: 'Item 2', },
  {
    text: 'More',
    children: [
      { text: 'More 1', children: [] },
      { text: 'More 2'},
      { text: 'Other', children:[ {text: 'Other-1'}, {text: 'Other-2'}, {text: 'Other-3'} ] }
    ]
  }
];
 

Комментарии:

1. Я попытался зациклить массив, например, array.forEach(элемент => { a = arr[элемент]; console.log(a), если(a.дети != null amp;amp; a.дети. длина){ arr = a; }еще { результат = a; } });

2. Вы должны поместить свой код, который не работает, в вопрос вместе с комментариями о том, что не работает… это очень поможет людям рассказать вам, что не так с вашим кодом (для чего хорош этот сайт), а не о том, что писать.

3. @Beska мой полный код немного сложен, и здесь вставлена минимальная строка кода для решения конкретной проблемы. Мне нужна простая функция JavaScript, которая может принимать массив индексов, например var = indexesToCheck = [2,2,1]; и она должна выполнять цикл, хотя этот вложенный массив и ожидаемый элемент { текст: ‘Другой-2’}. Помните, что заданные индексы на самом деле являются последовательностью для достижения этого конкретного элемента в массиве.

4. Верно… вы опубликовали минимальный код в вопросе, который содержит некоторые примеры данных, и это хорошо. Но для того, чтобы получить качественные ответы, вам обычно следует опубликовать код, с которым возникли проблемы, как часть question…it похоже, вы сделали часть этого в своем первом комментарии. Этот код должен быть частью вопроса, поскольку он дает людям возможность увидеть, что вы пытаетесь сделать, и что может отсутствовать или быть неправильным в вашем подходе.

Ответ №1:

Ну, это не многомерный массив, и не потрепанный массив массивов. Это массив объектов (которые могут содержать другие массивы объектов, которые могут…).

Lodash _.get() должен сделать это за тебя:

 const _ = require('lodash');
const data = data = [
  { text: 'Item 1', },
  { text: 'Item 2', },
  {
    text: 'More',
    children: [
      { text: 'More 1', children: [] },
      { text: 'More 2'},
      { text: 'Other', children:[ {text: 'Other-1'}, {text: 'Other-2'}, {text: 'Other-3'} ] }
    ]
  }
];

const widget = _.get(obj, '[2].children[1]');

console.log('widget',widget);
 

Или… сверни свой собственный. Не так уж трудно пройти по дереву:

 function select(data, ...path) {
  let i    = path.shift() ;
  let node = data[i] ;

  while ( node amp;amp; (i=path.shift()) !== undefined ) {
    node = node?.children?.[i] ;
  }

  return node ;
}

const widget = select( data, 2, 1 );
console.log(widget);