使用对象数组:
[{... title:'sss'},
{... title:'esd'},
{... title:'ccc'},
{... title:'vvv'},
{... title:'bb'},
{... title:'ess'}]
我想搜索元素并返回一个仅包含每个结果标题的数组,如下所示:
const filtered = data.filter(function(el) {
return el.title === text;
}).map(title => title);
因此,如果我的搜索文字为es
,我将得到['esd','ess']
答案 0 :(得分:3)
你快到了
const filtered = data.filter(el => el.title === text).map(el => el.title)
答案 1 :(得分:2)
出于性能原因,您可以使用reduce
在初始数组上仅执行一次迭代,而不是两次迭代(filter
和map
):
const filtered = data.reduce((acc, val) => {
if (val.title === text)
acc.push(val.title);
return acc;
}, []);
注意: 没有必要针对特定标题进行过滤,然后仅返回标题数组。确保您得到的是相同文本的数组。 也许,您可以针对另一个属性进行过滤,或者将另一个属性包括在输出数组中只是为了区分结果项。
您还想了解有关执行此任务的transducers。
答案 2 :(得分:1)
按此,
因此,如果我的搜索文字为
es
,我将得到['esd','ess']
您需要this,
const filtered = data.filter(function(el) { return el.title.includes(text);}).map(el => el.title);
答案 3 :(得分:0)
const过滤= data.map(obj => obj.title);
答案 4 :(得分:0)
您可以使用Array.reduce()
和String.indexOf()
:
data.reduce((acc, { title }) => title.indexOf(text) > -1 ? (acc.push(title), acc) : acc, []);
演示:
const data = [{name: 'aa', title:'sss'},
{name: 'ee', title:'esd'},
{name: 'cc', title:'ccc'},
{name: 'vv', title:'vvv'},
{name: 'bb', title:'bb'},
{name: 'ss', title:'ess'}];
function filterData(data, text) {
return data.reduce((acc, { title }) => title.indexOf(text) > -1 ? (acc.push(title), acc) : acc, []);
}
const filtered = filterData(data, 'es');
console.log(filtered);
答案 5 :(得分:0)
只是分享一些不同的东西,这是一种使用函数生成器的单次迭代的方法。
此方法不需要过滤器和映射,只需要迭代数组,接受过滤器回调函数和map回调函数,并在过滤器结果为真时产生映射函数结果。
const data =
[{name: 'aa', title:'sss'},
{name: 'ee', title:'esd'},
{name: 'cc', title:'ccc'},
{name: 'vv', title:'vvv'},
{name: 'bb', title:'bb'},
{name: 'ss', title:'ess'}
];
function* filterAndMap(arr, filterCallback, mapCallback) {
for (const item of arr) {
if (filterCallback(item)) yield mapCallback(item);
}
}
const res = [...filterAndMap(data, ({title}) => title.indexOf('ss') > -1, ({title}) => title)];
console.log(res);