过滤器数组仅使用标题创建新数组

时间:2019-07-05 12:01:41

标签: javascript

使用对象数组:

[{... 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']

6 个答案:

答案 0 :(得分:3)

你快到了

const filtered = data.filter(el => el.title === text).map(el => el.title)

答案 1 :(得分:2)

出于性能原因,您可以使用reduce在初始数组上仅执行一次迭代,而不是两次迭代(filtermap):

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