在对象数组中找到包括对象数组的对象内部的值



我有一系列对象,其中包括来自对象数组的孩子,我需要在父阵列内找到值或在此数组的儿童内找到值等的值等。也许是递归的。我这样的tra脚:

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)

是返回源数组,但我需要数组,其中包括文本'我的''

因为您具有嵌套结构,因此无法使用.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));

(通过浏览器控制台比通过堆栈片段控制台更容易看到结果)

这是函数编程样式实现。为了简化输出,我刚刚收集了匹配项的id值。如果需要整个对象,请用obj替换obj.id

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);

太晚了,这是另一个递归发现:

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));

最新更新