我正在寻找一种很好的方法,根据条件将数组拆分为两个新数组。 假设我们有一个包含相同结构对象的列表,该对象具有bool属性,将其称为条件,并且我们想要两个新列表,其中我们只有相同的条件元素。
const cont1 = myArray.filter((el) => el.condition)
const cont2 = myArray.filter((el) => !el.condition)
我猜这可能有用,但是我想知道是否有更好的单迭代版本。
答案 0 :(得分:4)
一种选择是使用reduce
,它将在整个数组上的一次迭代中在功能上分离所有项目:
const myArray = [
{ condition: true },
{ condition: true },
{ condition: false },
]
const [cont1, cont2] = myArray.reduce(([cont1, cont2], item) => {
(item.condition ? cont1 : cont2).push(item);
return [cont1, cont2];
}, [[], []]);
console.log('cont1: ', cont1);
console.log('cont2: ', cont2);
或者,在功能上较差但可能更易于理解的是,您可以.push
使用外部变量:
const myArray = [
{ condition: true },
{ condition: true },
{ condition: false },
];
const cont1 = [];
const cont2 = [];
myArray.forEach((item) => {
(item.condition ? cont1 : cont2).push(item);
});
console.log('cont1: ', cont1);
console.log('cont2: ', cont2);
答案 1 :(得分:1)
Reduce可以工作,但可以减少到一个对象上,使用2个不同的数组作为对象成员:
const arr = [1,2,3];
arr.reduce((acc, next) => {
if (next % 2 === 1){
acc.odd.push(next);
} else {
acc.even.push(next);
}
return acc;
}, { odd: [], even: [] }); // { even: [2], odd: [1,3] }
答案 2 :(得分:1)
您可以像这样单行:
myArray.forEach(el=>el.condition?cont1.push(el):cont2.push(el));