如何自定义排序一个2D javascript对象

how to custom sort a 2D javascript object?

本文关键字:一个 2D javascript 对象 自定义 排序      更新时间:2023-09-26

我开始这个问题:如何排序对象的JS对象?

从2个评论中,我想出了我最好的方法来排序一个Javascript对象的对象(只是一个2D对象)。

假设data是一个2D对象变量,我按照内部对象的customer值排序。

首先转换为对象数组,如下所示:

data = $.map(data, function(k, v) {
    return [k];
});

然后我像这样排序:

data = data.sort(function(a, b){
    return a.customer > b.customer? 1: -1;
});

它运行良好,但是现在我想首先按日期变量排序,然后按客户变量排序。就像排序函数的工作方式在SQL (...sort by date desc, customer asc;)。

但是,我真正想做的其实要简单得多。在排序日期值时,我所要做的就是区分null!null值。结果是所有的空值将被组合在一起,所有的非空值将被组合在一起。

之后,所有的顶层对象都应该按照customer的顺序。

我想到了这个想法,基于我认为它应该如何工作:

data = data.sort(function(a, b){
    if (a.fin_date !== null){
        return 1;
    }
    return a.customer > b.customer? 1: -1;
});

这是一种工作。它将所有null值从头排序,并且所有空值都按正确的字母顺序排列,但所有其他fin_date值(!null1)都不是按字母顺序排列的。根据fin_date,它们也不符合顺序。fin_date不等于null的对象似乎没有任何特定的顺序。

所以这是我的问题:我需要fin-date != null的对象按字母顺序排列。

谢谢!

你根本没有比较日期。试试下面这个排序函数:

function(a, b) {
    var aDate = new Date(a.fin_date),
        bDate = new Date(b.fin_date);
    if (aDate < bDate) return -1;
    else if (aDate > bDate) return 1;
    return a.customer > b.customer ? 1: -1;
}

假设您的所有日期都晚于1970年(因为new Date(null)是01 Jan 1970 00:00:00 GMT)。

这是一个jsFiddle