2015-04-10 3 views
1

У меня есть следующий массив:Javascript упорядочения элементов в массиве объектов

[{"cod_nivel":"INC2","cod_modelo":"D"}, 
    {"cod_nivel":"INC2","cod_modelo":"B"},  
    {"cod_nivel":"PRIM","cod_modelo":"B"},  
    {"cod_nivel":"PRIM","cod_modelo":"D"}, 
    {"cod_nivel":"PRIM2","cod_modelo":"B"},  
    {"cod_nivel":"PRIM2","cod_modelo":"D"},  
    {"cod_nivel":"PRIM2","cod_modelo":"A"}] 

Мне нужно заказать этот массив объектов по «cod_modelo» по возрастанию сгруппированных по «cod_nivel». Таким образом, результат должен быть:

[{"cod_nivel":"INC2","cod_modelo":"B"}, 
    {"cod_nivel":"INC2","cod_modelo":"D"},  
    {"cod_nivel":"PRIM","cod_modelo":"B"},  
    {"cod_nivel":"PRIM","cod_modelo":"D"}, 
    {"cod_nivel":"PRIM2","cod_modelo":"A"},  
    {"cod_nivel":"PRIM2","cod_modelo":"B"},  
    {"cod_nivel":"PRIM2","cod_modelo":"D"}] 

Мой attemp:

var array = [{"cod_nivel":"INC2","cod_modelo":"D"}, 
     {"cod_nivel":"INC2","cod_modelo":"B"},  
     {"cod_nivel":"PRIM","cod_modelo":"B"},  
     {"cod_nivel":"PRIM","cod_modelo":"D"}, 
     {"cod_nivel":"PRIM2","cod_modelo":"B"},  
     {"cod_nivel":"PRIM2","cod_modelo":"D"},  
     {"cod_nivel":"PRIM2","cod_modelo":"A"}]; 
    var groups = {}; // I know i need some temp object to store the current level that is being ordered.. 
    for (var i = 0; i < array.length; i++) { 
     groups.push(array[i]); 
    } 

ответ

5

Метод sort будет делать работу за вас.

Этот код сортирует массив, сначала cod_nivel, затем cod_modelo.

Условный оператор:

condition ? expr1 : expr2 

& hellip; используется для сравнения элементов массива с помощью ключа. (Условный оператор часто называют "тройной оператор", потому что это единственный оператор JavaScript, который принимает три операнда.)

var arr= [{"cod_nivel":"INC2","cod_modelo":"D"}, 
 
      {"cod_nivel":"INC2","cod_modelo":"B"},  
 
      {"cod_nivel":"PRIM","cod_modelo":"B"},  
 
      {"cod_nivel":"PRIM","cod_modelo":"D"}, 
 
      {"cod_nivel":"PRIM2","cod_modelo":"B"},  
 
      {"cod_nivel":"PRIM2","cod_modelo":"D"},  
 
      {"cod_nivel":"PRIM2","cod_modelo":"A"} 
 
     ]; 
 

 
var sorted= arr.sort(function(a, b) { 
 
    return a.cod_nivel > b.cod_nivel ? 1 : 
 
     a.cod_nivel < b.cod_nivel ? -1 : 
 
     a.cod_modelo > b.cod_modelo ? 1 : 
 
     a.cod_modelo < b.cod_modelo ? -1 : 
 
     0; 
 
}); 
 

 
document.body.innerHTML= JSON.stringify(sorted).replace(/},/g,'},<br>');

+0

мне кажется вам нужно проверить 'cod_nivel' первый – Grundy

+0

да, но не сгруппированы по cod_nivel после заказа его cod_modelo. Он должен быть сгруппирован по cod_nivel (они должны быть один за другим объектами одного и того же cod_nivel) – Egidi

+0

Извините, я интерпретировал вопрос, поскольку нужно сначала сортировать 'cod_modelo'. Я обновлю. –

2
var array = [{"cod_nivel":"INC2","cod_modelo":"D"}, 
    {"cod_nivel":"INC2","cod_modelo":"B"},  
    {"cod_nivel":"PRIM","cod_modelo":"B"},  
    {"cod_nivel":"PRIM","cod_modelo":"D"}, 
    {"cod_nivel":"PRIM2","cod_modelo":"B"},  
    {"cod_nivel":"PRIM2","cod_modelo":"D"},  
    {"cod_nivel":"PRIM2","cod_modelo":"A"}]; 


var sortedArray = array.sort(function(a,b) { 
      return (a["cod_nivel"] > b["cod_nivel"]) ? 1 : -1; 
    }).sort(function(a,b) { 
      if(a["cod_nivel"] == b["cod_nivel"]) 
       return (a["cod_modelo"] > b["cod_modelo"]) ? 1 : -1; 
      else 
       return 0; 
    }); 
console.log(sortedArray); 

demo

+0

почему двойная сортировка? – Grundy

0

Если нет ограничений на использование внешнего jav ascript library, вы можете использовать Underscore js, эта библиотека специально предназначена для работы с объектами и коллекциями javascript. вы можете взять следующий пример для решения

var stooges = [{name: 'moe', age: 40}, {name: 'larry', age: 50}, {name: 'curly', age: 60}]; 

var sort = _.sortBy(stooges, 'name'); 

надеюсь, что это помогает ....

+0

'_.sortBy' может принимать более одного имени поля? – Grundy

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