数组内部对象数组内部对象JavaScript-搜索

数组内部对象数组内部对象JavaScript-搜索,javascript,arrays,object,Javascript,Arrays,Object,我有这样的数据: 如果其中一个对象的值中包含字符串的一部分,我希望获取对象数组 例如,如果搜索字符串是“string tha”,它应该返回 [ { id: '3', data: [ {category: 'swim', value: 'String that I Need'}, {category: 'ran', value: '456'}, {category: 'play', value: 'Testtest'} ] }]

我有这样的数据:

如果其中一个对象的值中包含字符串的一部分,我希望获取对象数组

例如,如果搜索字符串是“string tha”,它应该返回

   [ {
    id: '3',
    data: [
      {category: 'swim', value: 'String that I Need'},
      {category: 'ran', value: '456'},
      {category: 'play', value: 'Testtest'}
    ]
  }]
[{
        id: '1',
        data: [
          {category: 'swim', value: 'Abc'},
          {category: 'ran', value: '123'},
          {category: 'play', value: 'Test'}
        ]
      },
      {
        id: '2',
        data: [
          {category: 'swim', value: 'somethinf'},
          {category: 'ran', value: ''},
          {category: 'play', value: 'Abcd'}
        ]
      },]
如果搜索字符串为“Abc”,则应返回

   [ {
    id: '3',
    data: [
      {category: 'swim', value: 'String that I Need'},
      {category: 'ran', value: '456'},
      {category: 'play', value: 'Testtest'}
    ]
  }]
[{
        id: '1',
        data: [
          {category: 'swim', value: 'Abc'},
          {category: 'ran', value: '123'},
          {category: 'play', value: 'Test'}
        ]
      },
      {
        id: '2',
        data: [
          {category: 'swim', value: 'somethinf'},
          {category: 'ran', value: ''},
          {category: 'play', value: 'Abcd'}
        ]
      },]
到目前为止,我还不确定这是否是正确的方向:

const arr = bigData.map(
      (item) => item.data
    )
    const res = arr
      ?.map((item) => item.map((e) => e.value))
      .filter((i) => i.map((e) => e.includes(search) === true))

最简单的方法是Patrick已经提供的一行程序。您走的是正确的道路,但只是在正确使用数组函数时被绊倒了。如果您想将其作为函数编写,它将如下所示:

function searchBigData(bigData, searchText) {
    return bigData.filter(entry => entry.data.some(item => item.value.includes(searchText)));
}
供将来参考,这里的基本策略是:

  • 在bigData数组上使用
    filter
    ,因为您希望将其减少到满足条件的原始对象
  • 对于bigData中的每个项目,对
    数据
    数组使用
    some
    。只要
    数据
    中的一项与条件匹配,它就会返回true
  • 测试
    数据
    中的每个项目的
    以包含搜索文本

  • 没有理由将外部数组映射到每个对象的
    数据
    成员,因为返回值和输入值具有相同的布局。相反,您正在外部数组
    bigData
    上执行一个函数,它应该保留其内部数组成员
    data
    满足特定条件的对象

    您可以使用检查该条件,因为它应用于数组的每个元素,并且您只关心是否存在匹配的元素

    函数过滤器搜索(搜索){
    返回bigData.filter(
    ({data})=>data.some(
    ({value})=>value.includes(搜索)
    )
    );
    }
    常量bigData=[
    {
    id:'1',
    数据:[
    {类别:'swim',值:'Abc'},
    {类别:'ran',值:'123'},
    {类别:'play',值:'Test'}
    ]
    },
    {
    id:'2',
    数据:[
    {类别:'swim',值:'Abc'},
    {类别:'ran',值:'},
    {类别:'play',值:'abc'}
    ]
    },
    {
    id:'3',
    数据:[
    {category:'swim',value:'我需要的字符串'},
    {类别:'ran',值:'456'},
    {类别:'play',值:'Testtest'}
    ]
    }
    ];
    log(filterBySearch('stringtha');
    log(filterBySearch('Abc')
    
    .as控制台包装{max height:100%!important;}
    const arr=bigData.filter({data})=>data.some({value})=>value.includes(search))是!!!它是有效的,这是正确的,公正的回答@帕特里克罗伯茨