按嵌套属性对对象中的对象进行排序

16

我有一个看起来像下面这样的对象。如何基于嵌套对象中的通用属性对类似此类对象进行排序。我期望的输出是基于更高得分将player2排在第一位。

我的挑战在于访问每个对象的属性以进行排序。

以下是我考虑并尝试过但未能进行排序的内容。

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} 
    }

5
JavaScript 对象的属性是无序的。如果你想按照特定顺序排列值,需要将它们放入一个数组中。 - Jordan Running
3个回答

10

您需要使用对象对数据进行排序,而不是使用键的属性进行排序,然后必须将其反转,因为您需要进行降序排序。

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);


如果您使用sorted[key]编写属性,则会获得具有与原始数据相同的[key]:[value]对的对象…您不能依赖此写入顺序。(据我所知,它取决于您的javascript引擎的实现,并且当您使用Object.keys或Reflect.ownProps时,它会决定读回时的顺序。) - Code Uniquely

4
这里是一行使用 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);


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>


2
你应该声明在这里需要 jQuery。原帖并没有要求使用它。 - Jamie Hutber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接