如何在Javascript中按属性数对对象进行排序?

时间:2016-07-01 11:25:10

标签: javascript sorting

我有一个对象

{
"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;
});

2 个答案:

答案 0 :(得分:1)

在ES2015之前,JavaScript对象属性 没有定义的顺序。他们现在这样做,但for-inObject.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对象无法保证元素顺序。 所以也许你只能使用一个数组来处理排序结果。

参考:Does JavaScript Guarantee Object Property Order?