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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 12:28:20