Найти значение в массиве объектов, которые включают в себя дочерние элементы из массива объектов - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть массив объектов, которые включают в себя дочерние элементы из массива объектов, и мне нужно найти значение внутри родительского массива или найти значение внутри дочерних элементов этого массива и т. Д. Может быть рекурсивным.Я споткнулся так:

var array = [
  {
    id: 1,
    value: 'value',
    children: null
  },
  {
    id: 2,
    value: 'my value',
    children: [
      {
        id: 'child1',
        value: 'my value',
        children: null
      },
      {
        id: 'child2',
        value: 'value',
        children: null
      },
      {
        id: 'child3',
        value: 'value,
        children: [
          {
            id: 'childchild1',
            value: 'my value',
            children: null
          }
        ]
      }
    ]
  },
  {
    id: 3,
    value: 'value',
    children: null
  },
  {
    id: 4,
    value: 'my value',
    children: null
  }
]


function find(searchData, target){
  return target.filter((f)=>{
    if(f.value.includes(searchData)){
      return true
    }
    if(f.children){
      return find(searchData, f.children)
    }
  })
}

find('my', array)

Возвращает исходный массив, но мне нужен массив, который включает текст 'my'

Ответы [ 3 ]

0 голосов
/ 20 декабря 2018

Слишком поздно, вот еще одна рекурсивная находка:

var array = [
  {
    id: 1,
    value: 'value',
    children: null,
  },
  {
    id: 2,
    value: 'my value',
    children: [
      {
        id: 'child1',
        value: 'my value',
        children: null,
      },
      {
        id: 'child2',
        value: 'value',
        children: null,
      },
      {
        id: 'child3',
        value: 'value',
        children: [
          {
            id: 'childchild1',
            value: 'my value',
            children: null,
          },
        ],
      },
    ],
  },
  {
    id: 3,
    value: 'value',
    children: null,
  },
  {
    id: 4,
    value: 'my value',
  },
];

function find(search, arr) {
  function recur(result, search, arr) {
    if (!(arr && arr.length)) {
      return result;
    }
    return result
      .concat(
        ...arr.filter((item) =>
          item.value.includes(search),
        ),
      )
      .concat(
        ...arr.map((item) =>
          recur([], search, item.children),
        ),
      );
  }
  return recur([], search, arr);
}
console.log(find('my', array));
0 голосов
/ 20 декабря 2018

Вот реализация стиля функционального программирования .Для упрощения вывода я просто собрал id значения совпадений.Если вам нужен весь объект, замените obj.id на obj:

const array = [{id: 1,value: 'value',children: null},{id: 2,value: 'my value',children: [{id: 'child1',value: 'my value',children: null},{id: 'child2',value: 'value',children: null},{id: 'child3',value: 'value' ,children: [{id: 'childchild1',value: 'my value',children: null}]}]},{id: 3,value: 'value',children: null},{id: 4,value: 'my value'}];

const find = (searchData, target) => (target || []).reduce(
        (acc, obj) => acc.concat(obj.value.includes(searchData) ? obj.id : [],
                                 find(searchData, obj.children)),
        []
    );

const result = find('my', array);
console.log(result);
0 голосов
/ 20 декабря 2018

Поскольку у вас есть вложенная структура, вы не можете использовать .filter для получения всех вложенных объектов - .filter вернет вам только соответствующие объекты на самом верхнем уровне.Вместо этого определите пустой массив при первоначальном вызове, затем push для этого массива, когда элемент проходит тест, и передайте массив каждому рекурсивному вызову.Наконец, верните этот массив:

var array=[{id:1,value:'value',children:null},{id:2,value:'my value',children:[{id:'child1',value:'my value',children:null},{id:'child2',value:'value',children:null},{id:'child3',value:'value',children:[{id:'childchild1',value:'my value',children:null}]}]},{id:3,value:'value',children:null},{id:4,value:'my value'}];

function find(searchData, target, accum=[]){
  target.forEach((f)=>{
    if(f.children){
      find(searchData, f.children, accum)
    }
    if(f.value.includes(searchData)){
      accum.push(f);
    }
  });
  return accum;
}

console.log(find('my', array));

(результат, вероятно, легче увидеть через консоль браузера, чем через консоль фрагмента стека)

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