【问题标题】:Sort objects of objects by nested property按嵌套属性对对象的对象进行排序
【发布时间】:2018-07-02 17:54:47
【问题描述】:

我有一个看起来像下面的对象。如何根据嵌套对象中的公共属性对此类内容进行排序。我期望的输出是根据较高的分数让 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} 
    }

【问题讨论】:

  • JavaScript 对象的属性是无序的。如果你想要按特定顺序的值,你需要把它们放在一个数组中。

标签: javascript sorting object


【解决方案1】:

您无法对对象进行排序。您应该将对象转换为数组,然后对其进行排序。

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>

【讨论】:

  • 您应该声明 jQuery 是这里的要求。 OP 没有要求它。
【解决方案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);

【讨论】:

  • 如果您使用 sorted[key] 写入属性,那么您将获得一个具有与原始数据相同的 [key]:[value] 对的对象...您不能依赖此写入顺序。 (afaik 这取决于您的 javascript 引擎的实现,它决定了在您使用 Object.keys 或 Reflect.ownProps 时将它们读回的顺序。)
【解决方案3】:

这是使用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);

【讨论】:

    猜你喜欢
    • 2023-01-06
    • 1970-01-01
    • 2011-03-21
    • 2016-02-08
    • 1970-01-01
    • 2019-06-25
    • 2011-07-07
    • 1970-01-01
    相关资源
    最近更新 更多