我有一个看起来像下面的对象。如何基于嵌套对象中的公共属性对此类事进行排序。我期望的输出是玩家2根据较高的分数来获得。
我的挑战是访问每个对象的属性进行排序。
以下是我的想法和尝试,但它没有进行排序。
Object.keys(data).sort(function(p1, p2){
return p1.score - p2.score;
}).forEach(function(key) {
var value = data[key];
delete data[key];
data[key] = value;
});
我的数据
var data =
{
player1:
{ score: 4,
cards: 6 },
player2:
{ score: 6,
cards: 4}
}
答案 0 :(得分:2)
您需要使用对象对数据进行排序,而不是使用键的属性,然后必须将其还原,因为您需要降序排序。
return data[b].score - data[a].score;
// ^^^^^^^ ^^^^^^^ object
// ^ ^ descending
我建议使用空对象并按顺序键插入属性。
var data = { player1: { score: 4, cards: 6 }, player2: { score: 6, cards: 4 } },
sorted = {};
Object
.keys(data).sort(function(a, b){
return data[b].score - data[a].score;
})
.forEach(function(key) {
sorted[key] = data[key];
});
console.log(sorted);

答案 1 :(得分:0)
您无法对对象进行排序。您应该将对象转换为数组,然后对其进行排序。
var data =
{
player1:
{ score: 4,
cards: 6 },
player2:
{ score: 6,
cards: 4}
}
var array = $.map(data, function(value, index) {
value.key = index;
return value;
});
var sortedData = array.sort(function(p1, p2){
return p2.score - p1.score;
});
console.log(sortedData);

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
&#13;
答案 2 :(得分:0)
这里是一种使用Object.entries()
,Array.prototype.sort()
和Object.fromEntries
方法的行功能方法。排序之前,您需要使用Object.entries()
方法将对象设置为数组。它返回给定对象的键值对数组。然后按分数降序对数组进行排序。最后,使用Object.fromEntries()
方法将键值对转换为对象。
const data = {
player1: { score: 4, cards: 6 },
player2: { score: 6, cards: 4 },
};
const ret = Object.fromEntries(
Object.entries(data).sort((x, y) => y[1].score - x[1].score)
);
console.log(ret);