JavaScript过滤并减少对数组的连接

时间:2019-06-05 15:24:05

标签: javascript ecmascript-6

我尝试使用 filter map 概念,而不是使用{for}循环遍历数组。

这是我的旧代码。我正在传递一个数组来过滤和组合匹配的字符串。

function oldFunction(data) {
    let dataDeleted = '';
    let each
    for (each of data) {
        if (each.includes('_DELETE')) {
            dataDeleted = dataDeleted + each.substring(0, each.length - 7) + '###';
        }
    }
    dataDeleted = dataDeleted;
    console.log(dataDeleted);
}

oldFunction(['meow_DELETE', 'haga', 'Neigh_DELETE']);

输出为:'meow###Neigh###'

现在,当我尝试使用“过滤器”和“减少”方法时,它似乎不起作用:

function newMethod(data) {

    const dataDeleted = data
        .filter(d => d.includes('_DELETE'))
        .reduce((deletedData, d) => {
            deletedData.concat(`${d}### `);
        }, '');

    console.log(dataDeleted);
    return dataDeleted;

}

这将返回“未定义”。有指针吗?预先感谢。

3 个答案:

答案 0 :(得分:9)

我相信您只需要return减速器功能中的数据即可。

.reduce((deletedData, d) => {
   return deletedData.concat(`${d}### `);
}, '')

或使用速记版本:

.reduce((deletedData, d) => deletedData.concat(`${d}### `), '')

答案 1 :(得分:1)

这是使用join()concat()而不是recude()的另一种方法,因为reduce出于某种原因要避免这种情况,在内部对数组进行迭代。 一个人必须测试两种方法的性能,才能确定哪种方法更可取。

更新:我实际上did just that on JSperf,我的方法比Quantastical的方法慢60-70%,因此您一定要坚持下去。

Update2::我现在仅使用filter()reduce()更新了代码以满足注释中的新要求。

function newMethod(data) {

    const dataDeleted = data
        .filter(d => d.includes('_DELETE'))
        .reduce((deletedData, d) => {
          return deletedData.concat(`${deletedData.length ? '###' : ''}${d.replace(/_DELETE$/, '')}`);
        }, '');

    console.log(dataDeleted);
    return dataDeleted;

}
newMethod(['meow_DELETE', 'haga', 'Neigh_DELETE']);

答案 2 :(得分:1)

function newMethod(data) {

    const dataDeleted = data
        .filter(d => d.includes('_DELETE'))
        .reduce((acc, d) => {
            return acc.concat(`${d}### `);
        }, '');

    return dataDeleted;

 }