Skip to content

如何将JavaScript数组分成两组?

将JavaScript数组分成两组相对容易。根据您的需求,您可能已经知道每个值属于哪个组,或者您可能需要使用一个函数来确定。

从概念上讲,这两种解决方案非常相似。使用Array.prototype.reduce()和一个回调函数来确定每个元素属于哪个组。一个真值将把元素放入第一组,而一个假值将把元素放入第二组。

根据值将数组分组

如果每个组中的值事先已知,您可以使用一个布尔值数组来确定每个元素属于哪个组。

const bifurcate = (arr, filter) =>
  arr.reduce(
    (acc, val, i) => {
      acc[filter[i] ? 0 : 1].push(val);
      return acc;
    },
    [[], []]
  );

bifurcate(['beep', 'boop', 'foo', 'bar'], [true, true, false, true]);
// [ ['beep', 'boop', 'bar'], ['foo'] ]

请注意,filter数组的长度必须与arr数组相同。如果长度较短,剩余的元素将放入第二组。如果长度较长,额外的元素将被忽略。

根据函数将数组分组

如果每个组中的值事先不知道,您可以使用一个函数来确定每个元素属于哪个组。该函数将以当前元素和其索引作为参数,并应返回一个真值,如果元素属于第一组,则返回一个假值,如果元素属于第二组,则返回一个假值。

const bifurcateBy = (arr, fn) =>
  arr.reduce(
    (acc, val, i) => {
      acc[fn(val, i) ? 0 : 1].push(val);
      return acc;
    },
    [[], []]
  );

bifurcateBy(['beep', 'boop', 'foo', 'bar'], x => x[0] === 'b');
// [ ['beep', 'boop', 'bar'], ['foo'] ]

注意,fn 返回的值将会被强制转换为布尔值