按嵌套属性对对象排序

时间:2018-01-23 19:51:34

标签: javascript sorting object

我有一个看起来像下面的对象。如何基于嵌套对象中的公共属性对此类事进行排序。我期望的输出是玩家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} 
    }

3 个答案:

答案 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;
&#13;
&#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);