我有这样的数据:
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))
答案 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)));
}
为了将来参考,这里的基本策略是:
filter
,因为您希望将其减少到符合条件的原始对象。some
数组使用data
。一旦data
中的一项符合条件,它将返回true。data
中value
中的每个项目以包含搜索文本