按键对 JavaScript 对象进行排序

2022-08-29 22:29:46

我需要按键对JavaScript对象进行排序。

因此,以下是:

{ 'b' : 'asdsad', 'c' : 'masdas', 'a' : 'dsfdsfsdf' }

将变为:

{ 'a' : 'dsfdsfsdf', 'b' : 'asdsad', 'c' : 'masdas' }

答案 1

这个问题的其他答案已经过时,永远无法匹配实现现实,并且现在已经正式变得不正确,因为ES6 / ES2015规范已经发布。


请参阅Axel Rauschmayer的Exploring ES6中有关属性迭代顺序的部分

所有循环访问属性键的方法都按相同的顺序执行此操作:

  1. 首先是所有数组索引,按数字排序。
  2. 然后,所有字符串键(不是索引),按其创建顺序排列。
  3. 然后是所有符号,按其创建顺序排列。

所以,是的,JavaScript对象实际上是有序的,它们的键/属性的顺序可以改变。

下面介绍如何按键/属性(按字母顺序)对对象进行排序:

const unordered = {
  'b': 'foo',
  'c': 'bar',
  'a': 'baz'
};

console.log(JSON.stringify(unordered));
// → '{"b":"foo","c":"bar","a":"baz"}'

const ordered = Object.keys(unordered).sort().reduce(
  (obj, key) => { 
    obj[key] = unordered[key]; 
    return obj;
  }, 
  {}
);

console.log(JSON.stringify(ordered));
// → '{"a":"baz","b":"foo","c":"bar"}'

使用而不是与 ES5 引擎兼容。varconst


答案 2

JavaScript 对象1 没有排序。试图对它们进行“排序”是毫无意义的。如果要循环访问对象的属性,可以对键进行排序,然后检索关联的值:

var myObj = {
    'b': 'asdsadfd',
    'c': 'masdasaf',
    'a': 'dsfdsfsdf'
  },
  keys = [],
  k, i, len;

for (k in myObj) {
  if (myObj.hasOwnProperty(k)) {
    keys.push(k);
  }
}

keys.sort();

len = keys.length;

for (i = 0; i < len; i++) {
  k = keys[i];
  console.log(k + ':' + myObj[k]);
}

使用 Object.keys fanciness 的替代实现:

var myObj = {
    'b': 'asdsadfd',
    'c': 'masdasaf',
    'a': 'dsfdsfsdf'
  },
  keys = Object.keys(myObj),
  i, len = keys.length;

keys.sort();

for (i = 0; i < len; i++) {
  k = keys[i];
  console.log(k + ':' + myObj[k]);
}

1 个不要迂腐,但是没有JSON对象这样的东西