Плоское дерево массива js

Не могли бы вы помочь мне сгладить это дерево? Я пробовал несколько вещей, и это не сработало. Я хотел бы получить самый быстрый способ (алгоритм).

const source = [
  {
    item: { id: 1, name: "item name", code: "1d4g4" },
    children: [
      {
        item: { id: 2, name: "item name 2", code: "1d4g4" },
        children: [
          {
            item: { id: 2, name: "item name 2", code: "1d4g4" },
            children: [
              {
                item: { id: 3, name: "item name 2", code: "1d4g4" },
                children: [
                  { item: { id: 4, name: "item name 2", code: "1d4g4" }, children: [] },
                  { item: { id: 4, name: "item name 2", code: "1d4g4" }, children: [] },
                  { item: { id: 4, name: "item name 2", code: "1d4g4" }, children: [] },
                ],
              },
            ],
          },
        ],
      },
    ],
  },
];

Это результат, который я ожидаю получить:

  { id: 1, name: 'item name', code: '1d4g4' },
  { id: 2, name: 'item name 2', code: '1d4g4' },
  { id: 2, name: 'item name 2', code: '1d4g4' },
  { id: 3, name: 'item name 2', code: '1d4g4' },
  { id: 4, name: 'item name 2', code: '1d4g4' },
  { id: 4, name: 'item name 2', code: '1d4g4' },
  { id: 4, name: 'item name 2', code: '1d4g4' }
]```

Если вы говорите, что пробовали что-то, вы должны показать нам, что вы пробовали. В противном случае вы просите нас предоставить полное решение.

Taplar 18.12.2020 19:27

«Я пробовал кое-что» ~ Что вы пробовали?

Mr. Polywhirl 18.12.2020 19:27

Для массивов есть функция flatMap...

Heretic Monkey 18.12.2020 19:28

Должны ли последние три элемента иметь одинаковый идентификатор?

Mr. Polywhirl 18.12.2020 19:29

Ваш источник не является допустимым JavaScript.

AKX 18.12.2020 19:30

Каков ваш ожидаемый результат здесь, @Vadim?

Sajeeb Ahamed 18.12.2020 19:36

Абсолютным минимальным требованием при задании вопроса является публикация компилируемых данных. В ваших данных отсутствуют скобки {} после children: [. Любая IDE подсветит эти ошибки. Пожалуйста, создайте минимальный воспроизводимый пример, разместив допустимый массив объектов

adiga 18.12.2020 19:37
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Раскрытие чувствительных данных
Раскрытие чувствительных данных
Все внешние компоненты, рассмотренные здесь до сих пор, взаимодействуют с клиентской стороной. Однако, если они подвергаются атаке, они не...
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Руководство ChatGPT по продаже мини JS-файлов
Руководство ChatGPT по продаже мини JS-файлов
JS-файл - это файл, содержащий код JavaScript. JavaScript - это язык программирования, который в основном используется для добавления интерактивности...
4
7
670
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

После исправления вашего синтаксиса, чтобы он был действительно действительным JavaScript, вам понадобится рекурсивная функция:

function flatten(destArray, nodeList) {
  nodeList.forEach((node) => {
    destArray.push(node.item);
    flatten(destArray, node.children || []);
  });
}

const source = [
  {
    item: { id: 1, name: "item name", code: "1d4g4" },
    children: [
      {
        item: { id: 2, name: "item name 2", code: "1d4g4" },
        children: [
          {
            item: { id: 2, name: "item name 2", code: "1d4g4" },
            children: [
              {
                item: { id: 3, name: "item name 2", code: "1d4g4" },
                children: [
                  { item: { id: 4, name: "item name 2", code: "1d4g4" }, children: [] },
                  { item: { id: 4, name: "item name 2", code: "1d4g4" }, children: [] },
                  { item: { id: 4, name: "item name 2", code: "1d4g4" }, children: [] },
                ],
              },
            ],
          },
        ],
      },
    ],
  },
];

const dest = [];
flatten(dest, source);
console.info(dest);

Выходы

[
  { id: 1, name: 'item name', code: '1d4g4' },
  { id: 2, name: 'item name 2', code: '1d4g4' },
  { id: 2, name: 'item name 2', code: '1d4g4' },
  { id: 3, name: 'item name 2', code: '1d4g4' },
  { id: 4, name: 'item name 2', code: '1d4g4' },
  { id: 4, name: 'item name 2', code: '1d4g4' },
  { id: 4, name: 'item name 2', code: '1d4g4' }
]

У меня было это до моего плохого

Vadim Tomashevsky 18.12.2020 19:43

Вы можете написать внутренний visit метод для обработки обхода дерева и добавления элементов во внутренний results список.

Примечание. Убедитесь, что ваши данные JS/JSON правильно структурированы.

const tree = [{
  item: {id: 1, name: "item name", code: "1d4g4"},
  children: [{
    item: {id: 2, name: "item name 2", code: "1d4g4"},
    children: [{
      item: {id: 2, name: "item name 2", code: "1d4g4"},
      children: [{
        item: {id: 3, name: "item name 2", code: "1d4g4"},
        children:[
          {item: {id: 4, name: "item name 2", code: "1d4g4"}, children: []},
          {item: {id: 4, name: "item name 2", code: "1d4g4"}, children: []},
          {item: {id: 4, name: "item name 2", code: "1d4g4"}, children: []},
        ]
      }]
    }]
  }]
}];

const treeToList = (tree, results = []) => {
  const visit = ({ item, children = [] }, res) => {
    if (item) res.push(item);
    children.forEach(child => visit(child, res));
  }
  visit({ children: tree }, results);
  return results;
}

console.info(treeToList(tree));
.as-console-wrapper { top: 0; max-height: 100% !important; }

Вы можете взять Array#flatMap и обратный вызов, который вызывает сам себя.

const
    flat = ({ item, children = [] }) => [item, ...children.flatMap(flat)],
    data = [{ item: { id: 1, name: "item name", code: "1d4g4" }, children: [{ item: { id: 2, name: "item name 2", code: "1d4g4" }, children: [{ item: { id: 2, name: "item name 2", code: "1d4g4" }, children: [{ item: { id: 3, name: "item name 2", code: "1d4g4" }, children: [{ item: { id: 4, name: "item name 2", code: "1d4g4" }, children: [] }, { item: { id: 4, name: "item name 2", code: "1d4g4" }, children: [] }, { item: { id: 4, name: "item name 2", code: "1d4g4" }, children: [] }] }] }] }] }],
    result = data.flatMap(flat);

console.info(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Const flatten = (data) => data.map(({ children }) => ([...flatten(children)]));

Ваш текущий код обходит все дерево, но никогда не извлекает item из данных. Другая проблема заключается в том, что вы в настоящее время используете карту , что означает, что результирующее значение всегда будет иметь то же количество элементов, что и исходный массив. Используйте flatMap, чтобы увеличить или уменьшить количество элементов в массиве.

Изменяя свой код как можно меньше, он может выглядеть так:

const flatten = (data) => data.flatMap(({item, children}) => ([item, ...flatten(children)]));

const flatten = (data) => data.flatMap(({item, children}) => ([item, ...flatten(children)]));

const data = [{
  item: {id: 1, name: "item name", code: "1d4g4"},
  children: [{
    item: {id: 2, name: "item name 2", code: "1d4g4"},
    children: [{
      item: {id: 2, name: "item name 2", code: "1d4g4"},
      children: [{
        item: {id: 3, name: "item name 2", code: "1d4g4"},
        children:[
          {item: {id: 4, name: "item name 2", code: "1d4g4"}, children: []},
          {item: {id: 4, name: "item name 2", code: "1d4g4"}, children: []},
          {item: {id: 4, name: "item name 2", code: "1d4g4"}, children: []},
        ]
      }]
    }]
  }]
}];

console.info(flatten(data));

Другие вопросы по теме