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

时间:2020-02-04 21:29:58

标签: javascript arrays object

我有这样的数据:

   const bigData = [
  {
    id: '1',
    data: [
      {category: 'swim', value: 'Abc'},
      {category: 'ran', value: '123'},
      {category: 'play', value: 'Test'}
    ]
  },
  {
    id: '2',
    data: [
      {category: 'swim', value: 'Abc'},
      {category: 'ran', value: ''},
      {category: 'play', value: 'abc'}
    ]
  },
  {
    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'}
    ]
  }]

如果搜索字符串为“ Abc”,则应返回

[{
        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))

2 个答案:

答案 0 :(得分:3)

由于返回值和输入值具有相同的布局,因此没有理由将外部数组map()用作每个对象的data成员。而是在外部数组bigData上执行filter(),这应该保留内部数组成员data满足特定条件的对象。

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

function filterBySearch (search) {
  return bigData.filter(
    ({ data }) => data.some(
      ({ value }) => value.includes(search)
    )
  );
}

const bigData = [
  {
    id: '1',
    data: [
      {category: 'swim', value: 'Abc'},
      {category: 'ran', value: '123'},
      {category: 'play', value: 'Test'}
    ]
  },
  {
    id: '2',
    data: [
      {category: 'swim', value: 'Abc'},
      {category: 'ran', value: ''},
      {category: 'play', value: 'abc'}
    ]
  },
  {
    id: '3',
    data: [
      {category: 'swim', value: 'String that I Need'},
      {category: 'ran', value: '456'},
      {category: 'play', value: 'Testtest'}
    ]
  }
];

console.log(filterBySearch('String tha'));
console.log(filterBySearch('Abc'));
.as-console-wrapper{max-height:100%!important;}

答案 1 :(得分:2)

最简单的方法是Patrick已经提供的一种班轮。您走在正确的道路上,但是只是对正确使用数组函数有所了解。如果您想将其编写为一个函数,它将看起来像:

function searchBigData(bigData, searchText) {
    return bigData.filter(entry => entry.data.some(item => item.value.includes(searchText)));
}

为了将来参考,这里的基本策略是:

  1. 在bigData数组上使用filter,因为您希望将其减少到符合条件的原始对象。
  2. 对于bigData中的每个项目,请对some数组使用data。一旦data中的一项符合条件,它将返回true。
  3. 测试datavalue中的每个项目以包含搜索文本