繁体   English   中英

如何通过Javascript中的属性数量对对象进行排序?

[英]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-inObject.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对象不能保证元素顺序。 因此,也许您只能使用数组来处理排序结果。

参考: JavaScript是否保证对象属性顺序?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM