2015-01-07 4 views
0

У меня возникла проблема в сортировке объекта с помощью TearSheetTypeName и StartDate с использованием Javascript или Underscore.js. Объект выглядит следующим образом:Сортировка вложенных объектов с использованием Javascript и/или Underscore.js

{ 
    Components: {141: {TearSheetTypeName: "Skyscraper", StartDate: "2015-01-01"}} 
       {142: {TearSheetTypeName: "Skyscraper", StartDate: "2015-01-01"}} 
       {145: {TearSheetTypeName: "New Car", StartDate: "2015-01-15"}} 
       {146: {TearSheetTypeName: "New Car", StartDate: "2015-01-01"}} 
} 

В результате я хотел бы:

{ 
    Components: {146: {TearSheetTypeName: "New Car", StartDate: "2015-01-01"}} 
       {145: {TearSheetTypeName: "New Car", StartDate: "2015-01-15"}} 
       {141: {TearSheetTypeName: "Skyscraper", StartDate: "2015-01-01"}} 
       {142: {TearSheetTypeName: "Skyscraper", StartDate: "2015-01-01"}} 
} 

Я попытался сделать это:

data = _.sortBy(data, function(obj) { 
      return obj.TearSheetTypeName; 
     }); 

Но он изменил объект для использования 0, 1, 2, 3 в качестве имен объектов вместо 141, 142, 145 и 146. Он также не учитывает StartDate.

Любая помощь будет оценена по достоинству. Благодарю.

+0

Спасибо, что есть полезно знать. –

ответ

0

Кажется, что Компоненты должны быть массивом. С этой предпосылкой, ваш объект будет выглядеть следующим образом:

{ 
    Components: [ 
    {Id: 141, TearSheetTypeName: "Skyscraper", StartDate: "2015-01-01"}, 
    {Id: 142, TearSheetTypeName: "Skyscraper", StartDate: "2015-01-01"}, 
    {Id: 145, TearSheetTypeName: "New Car", StartDate: "2015-01-15"}, 
    {Id: 146, TearSheetTypeName: "New Car", StartDate: "2015-01-01"} 
    ] 
} 

Тогда вам не нужно даже подчеркнуть, чтобы отсортировать компоненты. Местные Array.prototype.sort работает так же хорошо (и если вы посмотрите на источник подчеркивания, is actually used by_.sortBy().

data.sort(function(a,b){ 

    if(a.TearSheetTypeName > b.TearSheetTypeName){ 
     return 1; 
    } 

    if(a.TearSheetTypeName < b.TearSheetTypeName){ 
     return -1; 
    } 

    //if we got this far, the strings are the same, so sort by date 
    if(new Date(a.StartDate) > new Date(b.Startdate)) { 
    return 1; 
    } 

    if(new Date(a.StartDate) < new Date(b.Startdate)) { 
    return -1; 
    } 

    //if we got this far, the criteria is the same 
    return 0; 
}); 

Рода происходит в месте, так что вам не нужно назначить его.

Смежные вопросы