javascript 数组排序失败-没有属性的对象被放在顶部

pnwntuvh  于 2023-01-19  发布在  Java
关注(0)|答案(3)|浏览(177)

我有一个对象数组,如下所示:

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值的对象总是在排序后排在数组的第一位。我怎么把它们放在最后呢?

kzmpq1sx

kzmpq1sx1#

您可以使用Number.isFinite来区分正常数字和其他任何东西,比如字符串。
请注意,当前的排序回调函数可以简化为一个减法,如return a.cprice - b.cprice,要将上述判别加到它上面,可以像Number.isFinite(b.cprice) - Number.isFinite(a.cprice)这样做减法,当它为0时(它们属于同一“类别”),继续a.cprice - b.cprice减法(或其逆运算):

const plans = [{surf: 5,price: 299,cprice: 199,cdur: 3,},{surf: 5,price: 249,cprice: 199,cdur: 3,},{surf: 15,price: 149,cprice: "",cdur: "",},];

const sortAsc = (a, b) => Number.isFinite(b.cprice) - Number.isFinite(a.cprice) || a.cprice - b.cprice;
const sortDesc = (a, b) => Number.isFinite(b.cprice) - Number.isFinite(a.cprice) || b.cprice - a.cprice;

console.log(plans.sort(sortDesc));

我不建议在没有price的情况下将price定义为字符串。相反,根本不需要这个属性。如果你这样做了,上面的代码仍然可以正常工作。

fgw7neuy

fgw7neuy2#

您可以检查空字符串并将这些值移到底部,否则按值排序。

let
    plans = [{ surf: 5, price: 14, cprice: "", cdur: "" }, { surf: 5, price: 299, cprice: 198, cdur: 3 }, { surf: 5, price: 249, cprice: 199, cdur: 3 }, { surf: 15, price: 149, cprice: "", cdur: "" }];
    

plans.sort((a, b) =>
    (a.cprice === '') - (b.cprice === '') ||
    a.cprice - b.cprice
);

console.log(plans)
.as-console-wrapper { max-height: 100% !important; top: 0; }
67up9zun

67up9zun3#

首先我建议你不要混合类型,cpriceint类型是合乎逻辑的,如果cprice没有定义,那么使用nullundefined代替空字符串""
您可以修改比较函数,以便在比较之前检查cprice属性中是否存在值。如果其中一个对象没有cprice的值(或者该值是空字符串""),你可以把那个对象设置得“更大”(或“lesser”,取决于排序顺序),以便将其放置在排序数组的最后。您可以将代码修改为:

function cpriceDesc(a, b) {
        if (a.cprice === "") {
            return 1;
        }
        if (b.cprice === "") {
            return -1;
        }
        if (a.cprice < b.cprice ){
            return -1;
        }
        if (a.cprice > b.cprice ){
            return 1;
        }
        return 0;
    }

    function cpriceAsc( a, b ) {
        if (a.cprice === "") {
            return 1;
        }
        if (b.cprice === "") {
            return -1;
        }
        if (a.cprice > b.cprice ){
            return -1;
        }
        if (a.cprice < b.cprice ){
            return 1;
        }
        return 0;
    }

要知道在javascript中,有更快的方法来进行这种排序,@trincot的答案肯定更短,更有效,更可读,更易维护。

相关问题