Recursively filter array of objects

后端 未结 7 944
一个人的身影
一个人的身影 2020-11-29 00:00

Hitting a wall with this one, thought I would post it here in case some kind soul has come across a similar one. I have some data that looks something like this:

<         


        
7条回答
  •  臣服心动
    2020-11-29 00:29

    const input = [
      {
        value: 'Miss1',
        children: [
          { value: 'Miss1' },
          { value: 'Hit1', children: [ { value: 'Miss3' } ] }
        ]
      },
      {
        value: 'Miss4',
        children: [
          { value: 'Miss5' },
          { value: 'Miss6', children: [ { value: 'Hit2' } ] }
        ]
      },
      {
        value: 'Miss7',
        children: [
          { value: 'Miss8' },
          { value: 'Miss9', children: [ { value: 'Miss10' } ] }
        ]
      },
      {
        value: 'Hit3',
        children: [
          { value: 'Miss11' },
          { value: 'Miss12', children: [ { value: 'Miss13' } ] }
        ]
      },
      {
        value: 'Miss14asds',
        children: [
          { value: 'Hit4sdas' },
          { value: 'Miss15', children: [ { value: 'Miss16' } ] }
        ]
      },
    ];
    
    function filter(arr, term) {
        var matches = [];
        
        if (!Array.isArray(arr)) return matches;
    
        arr.forEach(function(i) {
         
            if (i.value === term) {
        
             const filterData =  (i.children && Array.isArray(i.children))? i.children.filter(values => values.value ===term):[];
             console.log(filterData)
             i.children =filterData;
                matches.push(i);
              
            } else {
           // console.log(i.children)
                let childResults = filter(i.children, term);
                if (childResults.length)
         matches.push(Object.assign({}, i, { children: childResults }));
            }
        })
    
        return matches;
    }
    
    
    const filterData= filter(input,'Miss1');
    console.log(filterData)

    Below code for filter the parent and child array data using recursive function

    const input = [
      {
        value: 'Miss1',
        children: [
          { value: 'Miss2' },
          { value: 'Hit1', children: [ { value: 'Miss3' } ] }
        ]
      },
      {
        value: 'Miss4',
        children: [
          { value: 'Miss5' },
          { value: 'Miss6', children: [ { value: 'Hit2' } ] }
        ]
      },
      {
        value: 'Miss7',
        children: [
          { value: 'Miss8' },
          { value: 'Miss9', children: [ { value: 'Miss10' } ] }
        ]
      },
      {
        value: 'Hit3',
        children: [
          { value: 'Miss11' },
          { value: 'Miss12', children: [ { value: 'Miss13' } ] }
        ]
      },
      {
        value: 'Miss14',
        children: [
          { value: 'Hit4' },
          { value: 'Miss15', children: [ { value: 'Miss16' } ] }
        ]
      },
    ];
    
    var res = input.filter(function f(o) {
      if (o.value.includes("Hit")) return true
    
      if (o.children) {
        return (o.children = o.children.filter(f)).length
      }
    })
    console.log(JSON.stringify(res, null, 2))

提交回复
热议问题