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
相关产品推荐
相关产品推荐

