根据条件将列表分为两个新列表的最佳方法

时间:2018-12-05 10:00:41

标签: javascript

我正在寻找一种很好的方法,根据条件将数组拆分为两个新数组。 假设我们有一个包含相同结构对象的列表,该对象具有bool属性,将其称为条件,并且我们想要两个新列表,其中我们只有相同的条件元素。

const cont1 = myArray.filter((el) => el.condition)
const cont2 = myArray.filter((el) => !el.condition)

我猜这可能有用,但是我想知道是否有更好的单迭代版本。

3 个答案:

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