我有一个对象数组,如下所示:
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值的对象总是在排序后排在数组的第一位。我怎么把它们放在最后呢?
3条答案
按热度按时间kzmpq1sx1#
您可以使用
Number.isFinite
来区分正常数字和其他任何东西,比如字符串。请注意,当前的排序回调函数可以简化为一个减法,如
return a.cprice - b.cprice
,要将上述判别加到它上面,可以像Number.isFinite(b.cprice) - Number.isFinite(a.cprice)
这样做减法,当它为0时(它们属于同一“类别”),继续a.cprice - b.cprice
减法(或其逆运算):我不建议在没有price的情况下将price定义为字符串。相反,根本不需要这个属性。如果你这样做了,上面的代码仍然可以正常工作。
fgw7neuy2#
您可以检查空字符串并将这些值移到底部,否则按值排序。
67up9zun3#
首先我建议你不要混合类型,
cprice
是int
类型是合乎逻辑的,如果cprice
没有定义,那么使用null
或undefined
代替空字符串""
。您可以修改比较函数,以便在比较之前检查
cprice
属性中是否存在值。如果其中一个对象没有cprice
的值(或者该值是空字符串""
),你可以把那个对象设置得“更大”(或“lesser”,取决于排序顺序),以便将其放置在排序数组的最后。您可以将代码修改为:要知道在javascript中,有更快的方法来进行这种排序,@trincot的答案肯定更短,更有效,更可读,更易维护。