2015-07-22 71 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 }, 
} 

我到处都找过谷歌和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