我尝试使用 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;
}
这将返回“未定义”。有指针吗?预先感谢。
答案 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;
}