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

JS数组排序:仅将inventory为0的元素移至末尾且保留非零元素原顺序

问题描述

需要将包含车辆信息的数组中,inventory 属性值为0的元素移至数组末尾,同时保留其他非零inventory元素的原有顺序。

初始数组:

[
  {
    name: 'Honda',
    inventory: 5,
  },
  {
    name: 'Lambo',
    inventory: 0,
  },
  {
    name: 'Toyota',
    inventory: 10,
  },
]

期望输出:

[
  {
    name: 'Honda',
    inventory: 5,
  },
  {
    name: 'Toyota',
    inventory: 10,
  },
  {
    name: 'Lambo',
    inventory: 0,
  },
]

原使用的排序代码未达预期,实际输出中非零元素按降序排列:

const newItems = [...items].sort((a, b) => {
  if (a.inventory === b.inventory) return 0;
  if (a.inventory === 0) return 1;
  return -1;
});
console.log(newItems);
错误原因分析

原排序函数逻辑有误:当两个元素的inventory都不为0时,函数直接返回-1,这会强制让前者排在后者前面,导致非零元素被按降序重新排列,完全破坏了原有顺序。

解决方案

方案一:拆分拼接数组(最直观且保证顺序)

将数组拆分为非零inventory元素和零inventory元素两个部分,再将后者拼接在前者后面。这种方法完全保留原顺序,逻辑简单可靠。

const nonZeroItems = items.filter(item => item.inventory !== 0);
const zeroItems = items.filter(item => item.inventory === 0);
const newItems = [...nonZeroItems, ...zeroItems];
console.log(newItems);

方案二:修正排序函数(利用稳定排序特性)

ES2019及之后,JavaScript的Array.sort()是稳定排序(相等元素的相对顺序会被保留)。我们只需在排序函数中处理inventory为0的情况,其他情况返回0,让非零元素维持原有顺序。

const newItems = [...items].sort((a, b) => {
  // a是0、b非0时,a排到后面
  if (a.inventory === 0 && b.inventory !== 0) return 1;
  // b是0、a非0时,b排到后面
  if (b.inventory === 0 && a.inventory !== 0) return -1;
  // 其余情况保持原顺序
  return 0;
});
console.log(newItems);

注意:若运行环境不支持ES2019及以上版本,sort()可能不是稳定排序,此时方案一的兼容性更优。

内容的提问来源于stack exchange,提问作者mending3

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 05:05:36