在javascript中对嵌套对象的对象进行排序(可能使用lodash?)

在javascript中对嵌套对象的对象进行排序(可能使用lodash?),javascript,sorting,lodash,Javascript,Sorting,Lodash,我有一个嵌套对象的对象,并希望按其中一个嵌套值进行排序(例如“month_sales”降序)。这就是数据的样子: { "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”降序)。这就是数据的样子:

{ 
"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 }
}
这就是我希望它看起来的样子(按月排序\u销售下降):

我浏览了Google和StackOverflow,只找到了几个关于排序对象而不是数组的答案,在每种情况下,答案都是“编写函数将对象转换为数组,排序,然后将其转换回对象。”


作为最后的手段,我愿意这样做,但似乎我应该能够做到这一点,而无需解构整个对象并将其重新组合起来。也许有一种优雅的方法可以在lodash或其他东西中实现这一点?

这是不可能的,因为对象的属性在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 }
]

然后,当您将其作为数组进行排序时,它将保持该顺序。

如果您将对象转换为数组,则可以按如下类别对其进行排序

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;
});
var arr=[
{姓名:“鲍勃”,销售额:13,收入:33,月销售额:149},
{姓名:“比尔”,今日销售额:20,周销售额:38,月销售额:186},
{姓名:“Jane”,今天销售额:17,周销售额:38,月销售额:164}
]
arr.sort(函数(x,y){
var category=“月销售额”
如果(x[类别]y[类别]){
返回1;
}
返回0;
});

虽然您无法对对象进行排序,但可以创建一个按您想要的任何属性排序的索引,例如,获取按月销售从高到低排序的名称列表:

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

只能有已排序的数组,不能有对象。为此,首先需要将对象映射到数组。以下是如何使用lodash和:

映射使用函数为每个数组项赋予一个新的
名称
属性,该属性用于对数组进行排序。

请检查此线程
console.log(index[0] + ':' + obj[index[0]].month_sales); // Bill:186
_(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 }
// ]