Добавление нового элемента в существующие данные - PullRequest
0 голосов
/ 23 июня 2018

Я пытаюсь использовать JavaScript для написания функции рекурсии, которая добавляет новые элементы (массив объектов) к существующим данным (неизвестный размер json).

Нужна помощь с этим.

Существующие данные: Данные содержат узлы и дочерние элементы. Каждыми детьми может быть больше дочерних элементов или узлов (лист)

var data = [
    {
        key:"root",
        children:[
            {
                key:"a0",
                children:[]
            },
            {
                key:"a1",
                children:[
                    {
                        key:"a10",
                        children:[]
                    },
                    {
                        key:"a11",
                        children:[]
                    },
                    {
                        key:"a12",
                        children:[]
                    }
                ],
            },
            {
                key:"a1",
                children:[]
            }
        ]
    }
]

Новые элементы, которые я хочу добавить к существующим данным:

var result = [
    {key:"a1"},
    {key:"a12"},
    {key:"21"}
]

В конце добавления новых элементов данные должны быть такими: Результат может быть разным каждый раз, но всегда может быть простым массивом объектов.

var data = [
    {
        key:"root",
        children:[
            {
                key:"a0",
                children:[]
            },
            {
                key:"a1",
                children:[
                    {
                        key:"a10",
                        children:[]
                    },
                    {
                        key:"a11",
                        children:[]
                    },
                    {
                        key:"a12",
                        children:[
                            {key:"21"}
                        ]
                    }
                ],
            },
            {
                key:"a1",
                children:[]
            }
        ]
    }
]

спасибо

Ответы [ 2 ]

0 голосов
/ 23 июня 2018

Вы можете использовать рекурсию для решения проблемы. Я выполнил следующие шаги

  • addChildren (item, result) - Эта функция получит data и result и вернет обновленный объект.
  • Сначала проверьте, является ли результат пустым или нет.
  • Если результат не пустой, получить первый элемент результат с помощью Array.shift
  • Проверьте, существует ли клавиша объекта в массиве .
  • Если объект существует, снова вызвать функцию addChildren с новыми параметрами
  • Если объект не существует, создайте объект и верните массив.

var data = [
    {
        key:"root",
        children:[
            {
                key:"a0",
                children:[]
            },
            {
                key:"a1",
                children:[
                    {
                        key:"a10",
                        children:[]
                    },
                    {
                        key:"a11",
                        children:[]
                    },
                    {
                        key:"a12",
                        children:[]
                    }
                ],
            },
            {
                key:"a2",
                children:[]
            }
        ]
    }
];

var result = [
    {key:"root"},
    {key:"a1"},
    {key:"a12"},
    {key:"21"}
]

function addChildren(item, result) {
  if (!result.length) { return []; }
  
  var res = result.shift();
  
  if (item.some(i => i.key === res.key)) {
    return item.map(i => {
      if (i.key === res.key) {
        return {
          key: i.key,
          children: addChildren(i.children, result)
        };
      }
      return i;
    });
  } else {
    item.push({
      key: res.key,
      children: addChildren([], result)
    });
  }
  return item;
}

console.log(addChildren(data, result));
0 голосов
/ 23 июня 2018

Вы можете сделать это с помощью метода reduce и передать начальный массив как аккумулятор.

var data = [{"key":"root","children":[{"key":"a0","children":[]},{"key":"a1","children":[{"key":"a10","children":[]},{"key":"a11","children":[]},{"key":"a12","children":[]}]},{"key":"a1","children":[]}]}]

var result = [
  {key:"a1"},
  {key:"a12"},
  {key:"21"}
]

result.reduce((r, e, i, arr) => {
  let obj = r && r.find(({key}) => key == e.key);
  if (obj && arr[i + 1]) return obj.children
  else if (r && !arr[i + 1]) r.push(e)
  else return null
}, data[0].children)

console.log(data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...