【问题标题】:How to sort object by number of properties in Javascript? [duplicate]如何按 Javascript 中的属性数量对对象进行排序? [复制]
【发布时间】:2016-07-01 11:25:09
【问题描述】:

我有一个对象

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

【问题讨论】:

  • 不幸的是,没有直接的方法可以做到这一点:(
  • 这是最好的。实际上,您不能对对象进行排序。
  • @Rohit416: 现在,在 ES2015 中。
  • 如前所述,您不能保证道具在对象中的顺序。但自 2015 年以来,“地图”对象可能会对您有所帮助..developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • @MattBryson:从 ES2015 开始,这不再是真的。

标签: javascript sorting


【解决方案1】:

在 ES2015 之前,JavaScript 对象属性没有定义的顺序。他们现在这样做了,但是for-inObject.keys 不遵守该顺序,只有Object.getOwnPropertyNames 等新功能才遵守该顺序。它也比看起来更复杂,并且非常使用有限。

尝试按特定顺序放置对象几乎没有任何充分的理由。如果您想订购,请使用数组,或者在 ES2015 中使用 Map(见下文)。

但话虽如此,在 ES2015 中,使用像您这样的属性名称是可能的:设置对象中属性顺序的唯一方法是确定它们的创建顺序创建 ,其中(对于不是数组索引的属性)是它们的顺序。因此,您可以通过获取所有属性名称,确定您想要它们的顺序,然后创建一个 new 对象,按该顺序添加属性。

注意,但是,某些类别的属性名称(我们称之为“数组索引”)的排序方式不同。您的所有属性名称都不符合定义,但(比如说)"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()));

【讨论】:

  • 当我看到这个线程时的第一个想法是使用Object.keys 获取一个数组然后对其进行排序以使用排序后的数组创建一个具有所需排序顺序的属性的新对象(但不是ES2015 风格)。那些箭头函数很棒:)
  • @Rohit416:是的。我非常喜欢 ES2015,但箭头函数在列表中确实非常非常高。 :-)
【解决方案2】:

Javascript 中的字典对象不能保证元素的顺序。 所以也许你只能使用一个数组来处理排序后的结果。

参考:Does JavaScript Guarantee Object Property Order?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-05
    • 2011-09-06
    • 1970-01-01
    • 2017-05-31
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多