JavaScript数组排序问题:含空cprice的对象始终排首位如何处理?
问题:含空值的对象排序后置于末尾
原始数据与排序函数
原始对象数组:
let plans = [ { surf: 5, price: 299, cprice: 199, cdur: 3, }, { surf: 5, price: 249, cprice: 199, cdur: 3, }, { surf: 15, price: 149, cprice: "", cdur: "", }, ];
原始排序函数:
function cpriceDesc( a, b ) { if ( a.cprice < b.cprice ){ return -1; } if ( a.cprice > b.cprice ){ return 1; } return 0; } function cpriceAsc( a, b ) { if ( a.cprice > b.cprice ){ return -1; } if ( a.cprice < b.cprice ){ return 1; } return 0; }
当前问题:cprice有值时排序正常,但含空值cprice的对象始终排在数组首位,需要将这类对象置于排序结果末尾。
解决方案
核心逻辑是优先判断空值状态,把空值对象强制往后排,再对非空值的cprice执行正常排序。
1. 降序排序(cpriceDesc)修改
function cpriceDesc(a, b) { const aIsEmpty = a.cprice === ""; const bIsEmpty = b.cprice === ""; // 空值优先往后排 if (aIsEmpty && !bIsEmpty) return 1; if (!aIsEmpty && bIsEmpty) return -1; // 非空值按原逻辑降序排序 if (a.cprice > b.cprice) return -1; if (a.cprice < b.cprice) return 1; return 0; }
2. 升序排序(cpriceAsc)修改
function cpriceAsc(a, b) { const aIsEmpty = a.cprice === ""; const bIsEmpty = b.cprice === ""; // 空值优先往后排 if (aIsEmpty && !bIsEmpty) return 1; if (!aIsEmpty && bIsEmpty) return -1; // 非空值按原逻辑升序排序 if (a.cprice < b.cprice) return -1; if (a.cprice > b.cprice) return 1; return 0; }
原逻辑问题原因
空字符串""与数字字符串(如"199")比较时,按字符编码顺序,空字符串的编码值小于数字字符的编码值,导致"" < "199"始终为true,所以空值对象会被优先排到前面。
内容的提问来源于stack exchange,提问作者lindbergpat
相关产品推荐
相关产品推荐

