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

因此如下:

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

将变成:

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

当前回答

也许更优雅的形式:

/***按键对键值对象排序,保持键到数据的相关性。*@param{Object}src键值对象*@return{Object}*/var ksort=函数(src){var keys=对象.keys(src),目标={};keys.sort();key.forEach(功能(键){target[key]=src[key];});回归目标;};//用途console.log(ksort({a: 1中,c: 3中,b: 2个}));

P.S.和ES6+语法相同:

function ksort( src ) {
  const keys = Object.keys( src );
  keys.sort();
  return keys.reduce(( target, key ) => {
        target[ key ] = src[ key ];
        return target;
  }, {});
};

其他回答

很多人都提到“对象无法排序”,但在那之后,他们给了你一个可行的解决方案。矛盾,不是吗?

没有人提及这些解决方案为何奏效。它们是这样的,因为在大多数浏览器的实现中,对象中的值是按照添加它们的顺序存储的。这就是为什么如果您从排序的键列表中创建新对象,它将返回预期结果。

我认为我们可以再增加一个解决方案——ES5功能方式:

function sortObject(obj) {
    return Object.keys(obj).sort().reduce(function (result, key) {
        result[key] = obj[key];
        return result;
    }, {});
}

上述ES2015版本(格式为“一行”):

const sortObject = o => Object.keys(o).sort().reduce((r, k) => (r[k] = o[k], r), {})

上述示例的简短解释(如评论中所要求的):

Object.keys为我们提供了所提供对象(obj或o)中的键列表,然后我们使用默认排序算法对这些键进行排序,接下来使用reduce将数组转换回对象,但这次对所有键进行了排序。

这里有一个单行解决方案(不是最有效的,但当涉及到像您的示例中那样的瘦对象时,我宁愿使用本机JS函数,也不要使用草率的循环)

const无序={“b”:“asdsad”,“c”:“masdas”,“a”:“dsfdsfsdf”}const ordered=Object.fromEntries(Object.entries(无序).sort())console.log(已订购);//a->b->c

这个问题的其他答案是过时的,从未与实现现实相匹配,并且在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解压缩map并sortBy对的第一个值,然后再次zip,它将返回排序的键。

如果要按值排序,请将对索引更改为1而不是0

var o = { 'b' : 'asdsad', 'c' : 'masdas', 'a' : 'dsfdsfsdf' };
console.log(_(o).toPairs().sortBy(0).fromPairs().value())

这对我有用

/**
 * 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;
};