JavaScript数组排序问题:0前置且非0元素降序排列
解决JavaScript数组排序:将0前置且非0元素倒序
嘿,我懂你遇到的这个排序困扰了——你想把所有0放在数组最前面,剩下的非0元素从大到小排列,但之前的逻辑只搞定了0的位置,非0元素反倒变成升序了对吧?
先聊聊你原来代码的问题
你写的排序回调:
arr.sort((x, y) => { if (x !== 0) { return 1; } if (x === 0) { return -1; } return y - x; });
核心问题是非0元素之间的排序逻辑根本没生效:当x和y都是非0的时候,第一个条件x !== 0就直接返回1了,这会让x始终排在y的后面,最后所有非0元素就默认按升序排列,完全没走到return y - x这一步。
正确的排序回调写法
我们需要明确三种情况的判断逻辑:
- 如果x是0,x应该排在y前面,返回
-1 - 如果y是0,y应该排在x前面,所以x要往后,返回
1 - 如果两者都不是0,就按倒序排列,返回
y - x
完整代码如下:
let arr = [0, 1, 0, 2, 0, 3, 0, 4, 0, 5]; arr.sort((x, y) => { if (x === 0) return -1; if (y === 0) return 1; return y - x; }); console.log(arr); // 输出:[0, 0, 0, 0, 0, 5, 4, 3, 2, 1]
另一种更直观的思路(拆分合并)
如果觉得sort回调的多条件判断容易绕晕,也可以把数组拆成两部分处理:
- 筛选出所有0
- 筛选出非0元素并倒序排序
- 把两部分合并起来
代码示例:
let arr = [0, 1, 0, 2, 0, 3, 0, 4, 0, 5]; const zeros = arr.filter(num => num === 0); const reversedNonZeros = arr.filter(num => num !== 0).sort((a, b) => b - a); const result = [...zeros, ...reversedNonZeros]; console.log(result); // 同样得到目标结果
这种方法逻辑更清晰,也避免了在sort回调里处理复杂的优先级判断。
内容的提问来源于stack exchange,提问作者lianbwl
相关产品推荐
相关产品推荐

