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

因此如下:

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

将变成:

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

当前回答

在保留引用的同时递归排序键。

function sortKeys(o){
    if(o && o.constructor === Array)
        o.forEach(i=>sortKeys(i));
    else if(o && o.constructor === Object)
        Object.entries(o).sort((a,b)=>a[0]>b[0]?1:-1).forEach(e=>{
            sortKeys(e[1]);
            delete o[e[0]];
            o[e[0]] = e[1];
        });
}

例子:

let x = {d:3, c:{g:20, a:[3,2,{s:200, a:100}]}, a:1};
let y = x.c;
let z = x.c.a[2];
sortKeys(x);
console.log(x); // {a: 1, c: {a: [3, 2, {a: 1, s: 2}], g: 2}, d: 3}
console.log(y); // {a: [3, 2, {a: 100, s: 200}}, g: 20}
console.log(z); // {a: 100, s: 200}

其他回答

截至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));

解决方案:

function getSortedObject(object) {
  var sortedObject = {};

  var keys = Object.keys(object);
  keys.sort();

  for (var i = 0, size = keys.length; i < size; i++) {
    key = keys[i];
    value = object[key];
    sortedObject[key] = value;
  }

  return sortedObject;
}

// Test run
getSortedObject({d: 4, a: 1, b: 2, c: 3});

说明:

许多JavaScript运行时将值按添加顺序存储在对象内。

要按键对对象的财产进行排序,可以使用object.keys函数,该函数将返回键数组。然后可以通过array.prototype.sort()方法对键数组进行排序,该方法对数组中的元素进行排序(无需将它们分配给新变量)。

键排序后,您可以开始逐个使用它们来访问旧对象的内容,以填充新对象(现在已排序)。

以下是该过程的示例(您可以在目标浏览器中进行测试):

/***返回对象的副本,该副本按原始对象的键排序。**@param{Object}Object-原始对象。*@返回{Object}按关键字排序的原始对象的副本。*/函数getSortedObject(对象){//将返回带有排序键的新对象var sortedObject={};//从旧/当前对象获取密钥数组var keys=对象.keys(对象);//排序键(在位)keys.sort();//使用排序键将值从旧对象复制到新对象for(var i=0,size=keys.length;i<size;i++){key=键[i];value=对象[key];sortedObject[key]=值;}//返回新对象return sortedObject;}/***试运行*/var unsortedObject={d: 4中,a: 1中,b: 2,c: 3个};var sortedObject=getSortedObject(未排序对象);for(sortedObject中的var键){var text=“Key:”+Key+“,Value:”+sortedObject[Key];var段落=document.createElement('p');paragraph.textContent=text;document.body.appendChild(段落);}

注意:Object.keys是一个ECMAScript 5.1方法,但这里有一个用于旧浏览器的polyfill:

if (!Object.keys) {
  Object.keys = function (object) {
    var key = [];
    var property = undefined;
    for (property in object) {
      if (Object.prototype.hasOwnProperty.call(object, property)) {
        key.push(property);
      }
    }
    return key;
  };
}

如果有嵌套对象或嵌套数组obj,请使用此代码。

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){
        var val = obj[key];
        if(val instanceof Array){
            //do for loop;
            var arr = [];
            jQuery.each(val,function(){
                arr.push(sortObjectByKey(this));
            }); 
            val = arr;

        }else if(val instanceof Object){
            val = sortObjectByKey(val)
        }
        sorted_obj[key] = val;
    });
    return sorted_obj;
};

如前所述,对象是无序的。

然而

你可能会发现这个成语很有用:

var o = { 'b' : 'asdsad', 'c' : 'masdas', 'a' : 'dsfdsfsdf' };

var kv = [];

for (var k in o) {
  kv.push([k, o[k]]);
}

kv.sort()

然后,您可以遍历kv并执行任意操作。

> kv.sort()
[ [ 'a', 'dsfdsfsdf' ],
  [ 'b', 'asdsad' ],
  [ 'c', 'masdas' ] ]

最好的方法是

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

 //else if its in reverse just do 

 const object = Object.keys(0).reverse ()

您可以首先将几乎类似数组的对象转换为实际数组,然后使用.reverse():

Object.assign([], {1:'banana', 2:'apple', 
3:'orange'}).reverse();
// [ "orange", "apple", "banana", <1 empty slot> ]

结尾处的空槽if cause,因为第一个索引是1而不是0。可以使用.length--或.pop()删除空槽。

或者,如果您想借用.reverse并在同一个对象上调用它,它必须是一个完全类似数组的对象。也就是说,它需要长度属性:

Array.prototype.reverse.call({1:'banana', 2:'apple', 
3:'orange', length:4});
// {0:"orange", 1:"apple", 3:"banana", length:4}

注意,它将返回同一个完全类似数组的对象对象,因此它不是一个真正的数组。然后可以使用delete删除长度属性。