按嵌套属性对对象的对象进行排序
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);
【讨论】:
以上是关于按嵌套属性对对象的对象进行排序的主要内容,如果未能解决你的问题,请参考以下文章