2013-03-06 5 views
0

Я начал с этим вопрос: How to sort a JS object of objects?Как настроить собственный 2D-объект javascript?

От 2 комментариев я придумал мой лучший способ сортировки объект Javascript объектов (только 2D объекта).

Предполагая, что data является двумерной переменной объекта, я сортирую значение 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 быть в алфавитном порядке.

Спасибо!

+1

Я предполагаю, что вы имеете в виду, что вы сортируете * массив * объектов, не так ли? Свойства объекта не сохраняются в любом порядке. –

+0

Да, вы правы, я обновил свой код выше. –

ответ

2

Вы не сравниваете даты вообще. Попробуйте что-то вроде этой сортировочной функции:

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) является 1 января 1970 00:00:00 GMT).

Адрес jsFiddle.