2015-07-22 2 views
1

У меня есть объект вложенных объектов и хотел бы сортировать по одному из вложенных значений (например, «month_sales» по убыванию). Это то, что выглядит данные, как:Сортировка объекта вложенных объектов в javascript (возможно, с использованием lodash?)

{ 
"Bob": { sales: 13, revenue: 33, month_sales: 149 }, 
"Bill": { today_sales: 20, week_sales: 38, month_sales: 186 }, 
"Jane": { today_sales: 17, week_sales: 38, month_sales: 164 } 
} 

Это то, что я хочу, чтобы выглядеть (сортировка по month_sales убыванию):

{ 
"Bill": { today_sales: 20, week_sales: 38, month_sales: 186 }, 
"Jane": { today_sales: 17, week_sales: 38, month_sales: 164 } 
"Bob": { sales: 13, revenue: 33, month_sales: 149 }, 
} 

Я посмотрел всего Google и StackOverflow, и только нашел пару ответов, которые касаются сортировки объекта, а не массива, и в каждом случае ответ был выполнен по строкам «написать функцию для преобразования объекта в массив, сортировать его, а затем вернуть обратно в объект «.

Я готов сделать это как последнее средство, но мне кажется, что я должен сделать это, не деконструируя весь объект и не вернув его снова. Может быть, есть элегантный способ сделать это в lodash или что-то еще?

+1

Пожалуйста, проверьте эту тему http://stackoverflow.com/questions/5525795/does-javascript-guarantee-object-property-order – Chop

ответ

1

Вы можете только отсортировали массивы, а не объекты. Для этого вам сначала нужно указать карту вашего объекта в массив. Вот как вы можете сделать это с помощью lodash map() и sortBy():

_(data) 
    .map(function(value, key) { 
     return _.defaults({ name: key }, value); 
    }) 
    .sortBy('name') 
    .value(); 
// → 
// [ 
// { name: "Bill", today_sales: 20, week_sales: 38, month_sales: 186 }, 
// { name: "Bob", sales: 13, revenue: 33, month_sales: 149 }, 
// { name: "Jane", today_sales: 17, week_sales: 38, month_sales: 164 } 
// ] 

отображения использует функцию defaults(), чтобы дать каждому элемент массива нового name свойства, которое используется для сортировки массива.

1

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

[ 
    { name: "Bob", sales: 13, revenue: 33, month_sales: 149 }, 
    { name: "Bill", today_sales: 20, week_sales: 38, month_sales: 186 }, 
    { name: "Jane", today_sales: 17, week_sales: 38, month_sales: 164 } 
] 

Затем, когда вы сортировать его как массив будет поддерживать этот порядок.

0

Если преобразовать объект в массив, то вы можете сортировать их по категориям, как этот

var arr = [ 
    { name: "Bob", sales: 13, revenue: 33, month_sales: 149 }, 
    { name: "Bill", today_sales: 20, week_sales: 38, month_sales: 186 }, 
    { name: "Jane", today_sales: 17, week_sales: 38, month_sales: 164 } 
] 

arr.sort(function(x, y){ 
    var category = "month_sales" 
    if (x[category] < y[category]) { 
     return -1; 
    } 
    if (x[category] > y[category]) { 
     return 1; 
    } 
    return 0; 
}); 
0

В то время как вы не можете сортировать объект, вы можете создать индекс, отсортированный по любой собственности, которую Вы хотите, например чтобы получить список имен, отсортированных по month_sales высшего к низшему:

var obj = { 
"Bob": { sales: 13, revenue: 33, month_sales: 149 }, 
"Bill": { today_sales: 20, week_sales: 38, month_sales: 186 }, 
"Jane": { today_sales: 17, week_sales: 38, month_sales: 164 } 
} 

var index = Object.keys(obj).sort(function(a,b) { 
       return obj[b].month_sales - obj[a].month_sales; 
      }); 

Тогда получите один с наибольшим значением:

console.log(index[0] + ':' + obj[index[0]].month_sales); // Bill:186 
Смежные вопросы