我有一个对象
{
"William_Hill":{},
"bet365":{},
"royal panda":{"pay":0},
"karamba":{"roller":0,"braned":0,"pay":0},
"betfred":{"braned":0}
}
并希望通过属性的nuber对其进行排序,因此结果看起来像这样,它必须是一个对象
{
"William_Hill":{},
"bet365":{},
"betfred":{"braned":0},
"royal panda":{"pay":0},
"karamba":{"roller":0,"braned":0,"pay":0}
}
我已按照此类进行排序,但结果是数组
var keysSorted = Object.keys(resultArray).sort(function(a,b){
return Object.keys(resultArray[a]).length-Object.keys(resultArray[b]).length;
});
答案 0 :(得分:1)
在ES2015之前,JavaScript对象属性 没有定义的顺序。他们现在这样做,但for-in
或Object.keys
不会尊重该订单,只有Object.getOwnPropertyNames
等新功能才能遵守。它也比看起来更复杂,并且非常限制使用。
尝试按特定顺序放置对象几乎没有任何理由。如果您想要订购,请使用数组,或者在ES2015中使用Map
(见下文)。
但是,在ES2015中,使用与您类似的属性名称,可能:在对象中设置属性顺序的唯一方法是确定它们创建的顺序 ,(对于不是数组索引的属性)是它们所处的顺序。所以你可以通过获取所有属性名称,确定它们所需的顺序,然后创建 new < / em> object,按顺序添加属性。
谨防但是,某些类的属性名称(我们称之为“数组索引”)的排序方式不同。您的所有属性名称都不符合定义,但(比方说)"123"
会。
以下是这样做的一个例子,如果你真的想(我很高兴使用ES2015的箭头功能,因为这只适用于ES2015):
// The object
let obj = {
"William_Hill":{},
"bet365":{},
"royal panda":{"pay":0},
"karamba":{"roller":0,"braned":0,"pay":0},
"betfred":{"braned":0}
};
// Get its names, sort them by how may sub-props there are
let names = Object.keys(obj);
names.sort((a, b) => Object.keys(obj[a]).length - Object.keys(obj[b]).length);
// Get the new object
let newObj = names.reduce((acc, name) => {
acc[name] = obj[name];
return acc;
}, {});
// Show its property names
console.log(Object.getOwnPropertyNames(newObj));
当然,这可能会更短,为了清晰起见,我将步骤分开。同样地,我来回使用reduce
,你可以这样做最后一点:
// Get the new object
var newObj = {};
names.forEach(name => {
acc[name] = obj[name];
});
这是一个使用Map
的示例,它提供了更简单的条目排序(不用担心“数组索引”):
// The object
let obj = {
"William_Hill":{},
"bet365":{},
"royal panda":{"pay":0},
"karamba":{"roller":0,"braned":0,"pay":0},
"betfred":{"braned":0}
};
// Get its names, sort them by how may sub-props there are
let names = Object.keys(obj);
names.sort((a, b) => Object.keys(obj[a]).length - Object.keys(obj[b]).length);
// Get the map
let map = new Map();
names.forEach(name => {
map.set(name, obj[name]);
});
// Show its property names
console.log(Array.from(map.keys()));
答案 1 :(得分:-1)
Javascript中的Dict对象无法保证元素顺序。 所以也许你只能使用一个数组来处理排序结果。