我在js中有一个特定的对象数组,表示一个表的列。 我的目标是:
var columns = {
"image": {
"show": false,
"orderable": true,
"value": 0,
"displayOrder":2
},
"name": {
"show": true,
"orderable": true,
"value": 1,
"displayOrder":0
},
"company": {
"show": false,
"orderable": false,
"value": 2,
"displayOrder":1
}
}
我必须通过" displayOrder"来订购对象,但是使用像
这样的函数columns.sort(function(a, b) {
return parseFloat(a.displayOrder) - parseFloat(b.displayOrder);
});
显然它会返回错误。 我怎么能这样做?
答案 0 :(得分:6)
由于.sort
方法(MDN),您只能在数组上使用Array.prototype
。因此,作为一种最简单的解决方案,我会考虑将您的columns
数据从对象改为数组:
var columnList = [
{
"key": "image",
"value": {
"show": false,
"orderable": true,
"value": 0,
"displayOrder":2
}
},
{
"key": "name",
"value": {
"show": true,
"orderable": true,
"value": 1,
"displayOrder":0
}
},
{
"key": "company",
"value": {
"show": false,
"orderable": false,
"value": 2,
"displayOrder":1
}
}
];
var result = columnList.sort(function(a, b) {
return parseFloat(a.value.displayOrder) - parseFloat(b.value.displayOrder);
});
console.log(result);
console.log
的结果恰好是
0:{key: "name", value: {…}}
1:{key: "company", value: {…}}
2:{key: "image", value: {…}}
此转换(从object
到array
)可以通过Object.keys
以编程方式完成:
result = Object.keys(columns)
.map(c => ({ key: c, value: columns[c]}))
.sort((a, b) => a.value.displayOrder - b.value.displayOrder)
此处columns
是您的初始对象。在Object.keys()
和.map()
的帮助下,我将其转换为我之前描述的数组,因此可以在链中调用.sort()
方法。