最常用、最清晰的方式是用 filter() 分别筛选满足和不满足条件的元素;更高效的方式是用 reduce() 一次遍历完成拆分;还可封装为通用 partition 工具函数。

JavaScript 中按条件把一个数组拆分成两个数组,最常用、最清晰的方式是用 filter() 方法分别筛选出满足和不满足条件的元素。
用 filter() 一次生成两个数组
虽然 filter() 每次只返回一个新数组,但你可以调用两次,逻辑直观、代码易读:
- 第一个
filter()筛出符合条件的项 - 第二个
filter()筛出不符合条件的项(即对条件取反)
例如,把数字数组按奇偶拆分:
const nums = [1, 2, 3, 4, 5, 6]; const odds = nums.filter(n => n % 2 !== 0); // [1, 3, 5] const evens = nums.filter(n => n % 2 === 0); // [2, 4, 6]
用 reduce() 一次遍历完成拆分(更高效)
如果原数组很大,或判断逻辑开销高(比如要解析字符串、调用 API),建议用 reduce() ——只需遍历一次,避免重复执行条件函数:
立即学习“Java免费学习笔记(深入)”;
- 初始化一个包含两个空数组的对象作为累加器
- 根据当前元素是否满足条件,把它推入对应数组
- 最后解构出两个结果数组
const nums = [1, 2, 3, 4, 5, 6];
const { odds, evens } = nums.reduce(
(acc, n) => {
if (n % 2 !== 0) acc.odds.push(n);
else acc.evens.push(n);
return acc;
},
{ odds: [], evens: [] }
);
// odds → [1, 3, 5], evens → [2, 4, 6]
封装成可复用的工具函数
把逻辑抽出来,方便多次使用:
function partition(arr, predicate) {
return arr.reduce(
(acc, item) => {
if (predicate(item)) acc[0].push(item);
else acc[1].push(item);
return acc;
},
[[], []]
);
}
// 使用示例
const [adults, minors] = partition(
[{age: 25}, {age: 16}, {age: 30}],
person => person.age >= 18
);
// adults → [{age: 25}, {age: 30}], minors → [{age: 16}]
注意点:别直接用 for 循环修改原数组
有人会想边遍历边用 splice() 或 shift() 把元素移走,这容易导致索引错乱、漏项或死循环。除非有特殊理由,否则不要在遍历中改变原数组长度。保持函数式风格(不修改输入,返回新数组)更安全、更易维护。


















