You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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回调的多条件判断容易绕晕,也可以把数组拆成两部分处理:

  1. 筛选出所有0
  2. 筛选出非0元素并倒序排序
  3. 把两部分合并起来

代码示例:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:36:56