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

Posted

技术标签:

【中文标题】按嵌套属性对对象的对象进行排序【英文标题】: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 对象的属性是无序的。如果你想要按特定顺序的值,你需要把它们放在一个数组中。 【参考方案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);

【讨论】:

以上是关于按嵌套属性对对象的对象进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何按嵌套值对复杂对象进行排序

按日期对对象的嵌套数组进行排序

如何通过嵌套对象属性对 JavaScript 对象数组进行排序?

按对象属性对对象的 ArrayList 进行排序

按对象属性对 javascript 对象数组进行排序

按对象属性对 javascript 对象数组进行排序