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

因此如下:

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

将变成:

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

当前回答

@sindresorhus有一个很棒的项目,叫做排序键,非常棒。

您可以在此处查看其源代码:

https://github.com/sindresorhus/sort-keys

或者您可以将其与npm一起使用:

$ npm install --save sort-keys

以下也是他的自述文件中的代码示例

const sortKeys = require('sort-keys');

sortKeys({c: 0, a: 0, b: 0});
//=> {a: 0, b: 0, c: 0}

sortKeys({b: {b: 0, a: 0}, a: 0}, {deep: true});
//=> {a: 0, b: {a: 0, b: 0}}

sortKeys({c: 0, a: 0, b: 0}, {
    compare: (a, b) => -a.localeCompare(b)
});
//=> {c: 0, b: 0, a: 0}

其他回答

我喜欢上面的这个,只是它不起作用:

/**
 * Return an Object sorted by it's Key
 */
var sortObjectByKey = function(obj){
    var keys = [];
    var sorted_obj = {};

    for(var key in obj){
        if(obj.hasOwnProperty(key)){
            keys.push(key);
        }
    }

    // sort keys
    keys.sort();

    // create new array based on Sorted Keys
    jQuery.each(keys, function(i, key){
        sorted_obj[key] = obj[key];
    });

    return sorted_obj;
};

看起来像sorted_obj,没有秩序的保证,因为那张地图似乎更适合,我最终改变了地图的对象,类似这样:

/**
 * Return an Object sorted by it's Key
 */
var sortObjectByKey = function(obj){
    var keys = [];
    let sorted_map = new Map();

    for(var key in obj){
        if(obj.hasOwnProperty(key)){
            keys.push(key);
        }
    }

    // sort keys
    keys.sort();

    // create new map based on Sorted Keys
    keys.forEach(key => {
        sorted_map.set(key, obj[key]);
    });

    return sorted_map;
};
Object.keys(unordered).sort().reduce(
    (acc,curr) => ({...acc, [curr]:unordered[curr]})
    , {}
)

截至2023年1月

变量obj={'b':'Val',“a”:“Val”,'c':'bVal'}console.log(JSON.stringify(obj))obj=Object.fromEntries(Object.entries(obj).sort())console.log(JSON.stringify(obj));

这个问题的其他答案是过时的,从未与实现现实相匹配,并且在ES6/ES2015规范发布后正式变得不正确。


请参阅Axel Rauschmayer在《探索ES6》中关于属性迭代顺序的章节:

所有迭代属性键的方法都以相同的顺序执行:首先是数组索引,按数字排序。然后按创建顺序列出所有字符串键(不是索引)。然后是所有符号,按照它们的创建顺序。

是的,JavaScript对象实际上是有序的,它们的键/财产的顺序可以更改。

以下是如何按关键字/财产按字母顺序对对象进行排序:

常量无序={'b':'foo',“c”:“bar”,“a”:“baz”};console.log(JSON.stringify(无序));// → '{“b”:“foo”,“c”:“bar”,“a”:“baz”}'const ordered=Object.keys(无序).sort().reduce((obj,key)=>{obj[key]=无序[key];返回obj;}, {});console.log(JSON.stringify(有序));// → '{“a”:“baz”,“b”:“foo”,“c”:“bar”}'

为了与ES5引擎兼容,请使用var而不是const。

简单易读的代码段,使用lodash。

只有在调用sortBy时,才需要将键放在引号中。它不必在数据本身的引号中。

_.sortBy(myObj, "key")

另外,要映射的第二个参数是错误的。这应该是一种功能,但使用勇气更容易。

_.map( _.sortBy(myObj, "key") , "value");