Как преобразовать такой массив в нумерованный многоуровневый список?

Итак, генерируется массив:

[{serv? true name 'Карточка 1' children [{serve true name 'Карточка 1.1' } {serve true name 'Карточка 1.2'  children [{serve true name 'Карточка 1.2.1' } {serve true name 'Карточка 1.2.2' }]}]}
{serv? false name 'Карточка 2' children [{serve true name 'Карточка 2.1' } ]}]


Нужно нужно преобразовать такой массив в массив вида:
[{id 1 serv? true name 'Карточка 1'}
 {id 1.1 serve true name 'Карточка 1.1' }
 {id 1.2 serve true name 'Карточка 1.2'}
 {id 1.2.1 serve true name 'Карточка 1.2.1' }
 {id 1.2.2 serve true name 'Карточка 1.2.2' }
 {id 2 serv? false name 'Карточка 2'}
 {id 2.1 serve true name 'Карточка 2.1' }]


Не подскажите, как сделать такой одномерный массив, где id - это номер элемента с учётом его вложенности?
  • Вопрос задан
  • 270 просмотров
Решения вопроса 2
Finesse
@Finesse
Реализация алгоритма на JavaScript:

function treeToPlainList(tree, idPrefix = '') {
    let list = [];

    // Проходит по каждому элементу массива
    tree.forEach((item, index) => {
        // Добавляет к элементу свойство id
        const itemForPlainList = {...item, id: idPrefix + (index + 1)};
        // Удаляет из элемента свойство children
        delete itemForPlainList.children; 
        // Добавляет элемент в итоговый массив
        list.push(itemForPlainList);

        if (item.children) {
            // Добавляет в конец итогового массива элементы, которые возвращает функция treeToPlainList
            list = [...list, ...treeToPlainList(item.children, idPrefix + (index + 1) + '.')];
        }
    });

    return list;
}

const list = treeToPlainList(tree); // tree — изначальный массив, list — результат
Ответ написан
pterodaktil
@pterodaktil
js developer
const getList = (data) => {
  let res = [];
  const toList = ({serve, name, children}, index, prefix = '') => {
	  const id = prefix ? prefix + '.' + (index + 1) : (index + 1);
	  res.push({id: id, serve: serve, name: name});
	  children && children.length > 0 && children.forEach((v, k) => toList(v, k, id));
  }

  data.forEach((item, key) => {toList(item, key)});

  return res;
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы