[英]Javascript: Sort object array by number properties which include undefined
[英]How to sort object by number of properties in Javascript?
我有一个对象
{
"William_Hill":{},
"bet365":{},
"royal panda":{"pay":0},
"karamba":{"roller":0,"braned":0,"pay":0},
"betfred":{"braned":0}
}
并想按属性的数量对它进行排序,因此结果看起来应该像这样,它必须是一个对象
{
"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;
});
直到ES2015,JavaScript对象的属性没有定义的顺序。 他们现在这样做了,但是for-in
或Object.keys
并不遵循该顺序,只有Object.getOwnPropertyNames
类的新功能才遵循该顺序。 它比看起来还复杂,并且用途非常有限。
几乎没有任何很好的理由尝试按特定顺序放置对象。 如果要订购,请使用数组,或在ES2015中使用Map
(请参见下文)。
但这就是说,在ES2015中,使用像您一样的属性名称是可能的:设置对象中属性的顺序的唯一方法是确定属性的创建顺序,对于非数组属性索引)是它们将要使用的顺序。因此,您可以通过获取所有属性名称,确定所需的顺序,然后创建一个新的对象并按该顺序添加属性来实现。
不过请注意 ,某些类别的属性名称(我们称为“数组索引”)的排序方式不同。 您的所有属性名称都不符合定义,但是(例如) "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()));
Javascript中的Dict对象不能保证元素顺序。 因此,也许您只能使用数组来处理排序结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.