具有条件输出/应用的Javascript数组过滤器



我想知道,是否有办法过滤数组或流并将函数 A 应用于所有匹配项,将函数 B 应用于 JavaScript 中的所有非匹配项。下面是一些示例代码,可以对其进行更多解释:

// initial data
var names = ['Matthias', 'Maria', 'Bob', 'Anton'];
var namesWithM;
var namesWithoutM;
// gets only names starting with M, but not the others at the same time
namesWithM = names.filter(name => name.startsWith('M'))
// conditional lambda version
namesWithM = [];
namesWithoutM = [];
names.forEach(name => name.startsWith('M') ? namesWithM.push(name) : namesWithoutM.push(name));

// conditional classical version
namesWithM = [];
namesWithoutM = [];
names.forEach(function(name) {
if (name.startsWith('M'))
namesWithM.push(name)
else
namesWithoutM.push(name);
});

第一个版本只处理匹配项,但使用filter而不是forEach。有没有办法使用filter并同时为匹配和非匹配应用函数?像这样的伪代码:

names.filter(name.startsWith('M')).apply(namesWithM::push).or(namesWithoutM::push);

过滤器返回一个数组。因此,您可以使用此数组填充以M开头或不以 开头的name

在下面的示例中,过滤器用以M开头的名称填充数组。在回调filter,不以 M 开头的名称填充在另一个数组中

// initial data
var names = ['Matthias', 'Maria', 'Bob', 'Anton'];
var namesWithM;
var namesWithoutM = [];
namesWithM = names.filter((name) => {
if (!name.startsWith('M')) {
namesWithoutM.push(name)
}
return name.startsWith('M');
});
console.log(namesWithM, namesWithoutM);

我会使用reduce将数据分组为 2 种提到的情况。我认为没有任何理由在这里使用filter

let names = ['Matthias', 'Maria', 'Bob', 'Anton'];
let [namesWithM, namesWithoutM] = names.reduce((acc, name) => {
if (name.startsWith('M')) {
acc[0] = [...(acc[0] || []), name]
return acc;
}
acc[1] = [...(acc[1] || []), name]
return acc;
}, [])
// simpler version
console.log(namesWithM, namesWithoutM);
let [namesWithM1, namesWithoutM1] = names.reduce((acc, name) => {
const index = Number(!name.startsWith('M'));
acc[index] = [...(acc[index] || []), name];
return acc;
}, [])
console.log(namesWithM1, namesWithoutM1);

const names = ['Matthias', 'Maria', 'Bob', 'Anton'];
function A(item){
console.log('filtered');
console.log(item);
}
function B(item){
console.log('not-ffiltered');
console.log(item);
}
const filteredNames = names.filter(name => {
const isValid = name.startsWith('M')
if(isValid)
A(name)
else
B(name)
return isValid;
})

最新更新