Javascript для каждого рекурсивного массива объектов - PullRequest
2 голосов
/ 06 января 2020


мне нужна помощь в цикле по объекту с массивом объектов

Вот пример объекта:

const node = {
    documents: [{
        name: "test1"
    }],
    children: [{
        documents: [{
            name: "test2"
        }],
        children: [{
            documents: [{
                name: "test3"
            }],
            children: []
        }]
    }]
};


Моя проблема
Я попробовал некоторые решения здесь, но это не совсем то, что мне нужно. В основном я хочу переместить каждый объект из массива документов в детский массив.
Я уже получил это, но в настоящее время он делает это только в первом объекте, поэтому не рекурсивно ...
Я не могу понять это без создания кода Frankenstein-i sh ...
Я попытался , как я упоминал ранее, я использовал

Array.concat()

для добавления документов к детям, но только в первом объекте.
Как это должно выглядеть

const node = {
    children: [
    {
    name: "test1"
    },
    {
    children: [
        {
      name: "test2"
      },
      {
      children: [
        {name: "test3"}
      ]
      }
    ]
    }
  ]
};

Теперь во всех «глубинах» документы «добавлялись» к детям.
И это должно происходить с каждым детским ключом (глубиной).

Кто-то достаточно любезен, чтобы помочь мне?


РЕДАКТИРОВАТЬ:

Я думаю, мой пример не достаточно хорош. Вот некоторые фактические данные:

      const node = {
        id: 1,
        name: "Root Node",
        documents: [
          { name: "Doc Root 1", id: 1234 },
          { name: "Doc Root 2", id: 1235 }
        ],
        children: [
          {
            id: 2,
            name: "Sub Node Node1",
            documents: [
              { name: "Doc SubNote 1 1", id: 1236 },
              { name: "Doc SubNote 1 2", id: 1237 }
            ],
            children: [{
              id: 3,
              name: "Sub Sub Node Node 1",
              documents: [
                { name: "Doc SubSubNote 1 1", id: 1238 },
                { name: "Doc SubSubNote 1 2", id: 1239 }
              ],
              children: null,
              addTreeNodeDisabled: true,
              addLeafNodeDisabled: true,
              editNodeDisabled: true,
              delNodeDisabled: true,
            }],
            addTreeNodeDisabled: true,
            addLeafNodeDisabled: true,
            editNodeDisabled: true,
            delNodeDisabled: true,
          }
        ],
        addTreeNodeDisabled: true,
        addLeafNodeDisabled: true,
        editNodeDisabled: true,
        delNodeDisabled: true,
      };

Ответы [ 2 ]

3 голосов
/ 06 января 2020

Вы можете связать копию документов с детьми, вызвав функцию снова.

var f = ({ documents, children, ...o }) => {
        children = [...(documents || []), ...(children || [])].map(f);
        return children.length
            ? { ...o, children }
            : o;
    },
    data = { id: 1, name: "Root Node", documents: [{ name: "Doc Root 1", id: 1234 }, { name: "Doc Root 2", id: 1235 }], children: [{ id: 2, name: "Sub Node Node1", documents: [{ name: "Doc SubNote 1 1", id: 1236 }, { name: "Doc SubNote 1 2", id: 1237 }], children: [{ id: 3, name: "Sub Sub Node Node 1", documents: [{ name: "Doc SubSubNote 1 1", id: 1238 }, { name: "Doc SubSubNote 1 2", id: 1239 }], children: null, addTreeNodeDisabled: true, addLeafNodeDisabled: true, editNodeDisabled: true, delNodeDisabled: true, }], addTreeNodeDisabled: true, addLeafNodeDisabled: true, editNodeDisabled: true, delNodeDisabled: true, }], addTreeNodeDisabled: true, addLeafNodeDisabled: true, editNodeDisabled: true, delNodeDisabled: true },
    result = f(data);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
2 голосов
/ 06 января 2020

Я использовал здесь рекурсию для достижения результатов.

const node = {"documents":[{"name":"test1"}],"children":[{"documents":[{"name":"test2"}],"children":[{"documents":[{"name":"test3"}],"children":[]}]}]}

const unwrap = (v) => ({...{...v}[0]});

const merge = (node) => ([...node.documents, {children: (unwrap(node.children).hasOwnProperty("children") ? merge(unwrap(node.children)) : node.children) }]);

console.log(merge(node));
...