Рекурсивный поиск потомков по родительскому идентификатору - PullRequest
1 голос
/ 25 апреля 2019

У меня плоский массив (сплющенное дерево). Как реализовать рекурсивный поиск детей по parentIds с использованием библиотеки Lodash?

Например, по id = 1 мне нужно получить «JavaScript», «React» и «Vue».

array: 
  [{
    id: 1,
    name: 'Development',
    parentIds: [],
  },
  { 
    id: 2,
    name: 'JavaScript',
    parentIds: [1] 
  },
  { 
    id: 3,
    name: 'React',
    parentIds: [2]
   },
   {
     id: 4,
     name: "Vue",
     parentIds: [2]
   }]

Ответы [ 2 ]

1 голос
/ 25 апреля 2019
    $(function () {
        var array =
      [{
        id: 1,
        name: 'Development',
        parentIds: [],
      },
      {
        id: 2,
        name: 'JavaScript',
        parentIds: [1]
      },
      {
        id: 3,
        name: 'React',
        parentIds: [2]
       },
       {
         id: 4,
         name: "Vue",
         parentIds: [2]
       }]

        var getId = function (arrayItems, id) {
            if (arrayItems) {
                for (var i in arrayItems) {
                    if (arrayItems[i].id == id) {
                        return arrayItems[i];
                    };
                    var found = getId(arrayItems[i].items, id);
                    if (found) return found;
                }
            }
        };

        var searchedItem = getId(array, 3);
        alert(searchedItem.name);
    });
0 голосов
/ 25 апреля 2019

См. Решение ниже, я использовал lodash библиотека и рекурсивная функция:

function foo(array, pid, res = [], did = []) {
  array = _.filter(array, (obj) => {
    if (_.includes(obj.parentIds, pid) || _.intersection(obj.parentIds, did).length) {
      res.push(obj.name);
      did.push(obj.id);
      return false;
    } else {
      return true;
    }
  });
  res = Array.from(new Set(res));
  did = Array.from(new Set(did));
  if (array.length >= did.length) {
    res.push(foo(array, pid, res, did));
  }
  return Array.from(new Set(res));
}
...