如何实现先返回数组奇数元素再返回偶数元素的JavaScript函数?
解决数组奇偶元素分离问题:先奇数后偶数
嘿,我来帮你搞定这个函数!先看看你代码里的几个小问题,再给你正确的实现思路和代码~
你的代码里的问题
- 判断对象错误:你用
arr % 2来判断奇偶,但arr是整个数组,数组本身取模没有意义,应该判断每个遍历到的元素elem的奇偶性。 - 逻辑不符合需求:你的filter只尝试筛选偶数,但需求是先返回所有奇数,再返回所有偶数,需要分开筛选再合并。
- 缺少返回值:函数最后没有
return result,所以调用后不会返回任何结果。 - 调用参数错误:你传了二维数组
[[...]],但函数需要的是一维数组[...]。
正确的实现思路
要实现“先奇数后偶数”的需求,步骤很清晰:
- 从输入数组中筛选出所有奇数(注意处理负数的情况)
- 从输入数组中筛选出所有偶数
- 将奇数数组和偶数数组合并,返回合并后的结果
完整代码实现
export const sameParityFilter = (arr = []) => { // 筛选奇数:用Math.abs处理负数,确保判断准确 const oddNumbers = arr.filter(elem => Math.abs(elem) % 2 === 1); // 筛选偶数 const evenNumbers = arr.filter(elem => Math.abs(elem) % 2 === 0); // 合并数组:先奇数,后偶数 return [...oddNumbers, ...evenNumbers]; } // 正确的调用示例 console.log(sameParityFilter([-1, 0, 1, -3, 10, -2])); // 输出: [-1, 1, -3, 0, 10, -2] console.log(sameParityFilter([2, 0, 1, -3, 10, -2])); // 输出: [1, -3, 2, 0, 10, -2]
补充说明
- 负数处理:在JavaScript中,
-1 % 2的结果是-1,直接用elem % 2 !== 0也能识别奇数,但用Math.abs(elem) % 2 === 1更直观,避免对负数取模的困惑。 - 顺序保持:这个实现会保留原数组中奇数和偶数各自的相对顺序,比如原数组里的奇数
-1在1前面,结果里也会保持这个顺序。 - 空数组兼容:参数默认值设为
[],所以当没有传参或传空数组时,函数会返回空数组,符合预期。
内容的提问来源于stack exchange,提问作者Dmitry Chernyak
相关产品推荐
相关产品推荐

