使用JavaScript按键对对象中的对象进行字母顺序排序

3

我有一个嵌套对象,想要按字母顺序排序。

var obj = {
  'ABCD' : {
    'E' : {},
    'R' : {},
    'A' : {},
    'E' : {}
  },
  'WXYZ' : {
    'F' : {},
    'M' : {},
    'G' : {},
    'A' : {}
  },
  'MNOP' : {
    'A' : {},
    'H' : {},
    'B' : {},
    'C' : {}
  },
  'EFGH' : {
    'D' : {},
    'C' : {},
    'B' : {},
    'E' : {}
  }
}

我希望输出结果如下所示 -
{
  'ABCD' : {
    'A' : {},
    'E' : {},
    'E' : {},
    'R' : {}
  },
  'EFGH' : {
    'B' : {},
    'C' : {},
    'D' : {},
    'E' : {}
  },
  'MNOP' : {
    'A' : {},
    'B' : {},
    'C' : {},
    'H' : {}
  },
  'WXYZ' : {
    'A' : {},
    'F' : {},
    'G' : {},
    'M' : {}
  }
}

我已经编写了对直接键进行排序的代码,但我不知道如何对这些键内部的对象进行进一步排序, 以下是我的代码 -

var sorted = {}
Object.keys(obj).sort().forEach(function(val) {
  sorted[val] = obj[val]
})

请建议我如何实现上述输出。谢谢。

可能是重复的问题 https://dev59.com/jW035IYBdhLWcg3wQtsg,您可以尝试使用数组。 - Krzysztof Krzeszewski
1
注意:如果您有任何整数键,则无论添加到对象中的顺序如何,它们都将被排序到顶部。JavaScript是否保证对象属性顺序? - adiga
对象属性不能被排序 - FZs
@FZs 它们可以在ES6中使用。顺序是:1)整数键 2)所有其他字符串键,按添加顺序排序 3)所有符号键 http://2ality.com/2015/10/property-traversal-order-es6.html#traversing-the-own-keys-of-an-object - adiga
@adiga 好的,但是在“所有其他字符串键”内部排序键是否可能? - FZs
@FZs,OP的问题是创建一个带有排序键的新对象。然后它们将按照添加的顺序返回。 - adiga
3个回答

4
你可以采用递归方法处理嵌套对象。

const
    sort = o => Object.assign({}, ...Object
        .keys(o)
        .sort()
        .map(k => ({ [k]: o[k] && typeof o[k] === 'object' ? sort(o[k]) : o[k] }))
    );

var obj = { ABCD: { E: { }, R: { }, A: { } }, WXYZ: { F: { }, M: { }, G: { }, A: { } }, MNOP: { A: { }, H: { }, B: { }, C: { } }, EFGH: { D: { }, C: { }, B: { }, E: { } } },
    sorted = sort(obj);

console.log(sorted);
.as-console-wrapper { max-height: 100% !important; top: 0; }


我曾经以为你在传播Object:...Object - adiga
是的,是的,我的缩进搞混了。 - adiga

1

首先分配一个空对象,然后添加已排序的属性。

var sorted = {}
Object.keys(obj).sort().forEach(function(val) {
  sorted[val] = {}
  Object.keys(obj[val]).sort().forEach(function(val2) {
    sorted[val][val2] = obj[val][val2]
  })
})

完整代码片段:

var obj = {
  'ABCD': {
    'E': {},
    'R': {},
    'A': {},
    'E': {}
  },
  'WXYZ': {
    'F': {},
    'M': {},
    'G': {},
    'A': {}
  },
  'MNOP': {
    'A': {},
    'H': {},
    'B': {},
    'C': {}
  },
  'EFGH': {
    'D': {},
    'C': {},
    'B': {},
    'E': {}
  }
}

var sorted = {}
Object.keys(obj).sort().forEach(function(val) {
  sorted[val] = {}
  Object.keys(obj[val]).sort().forEach(function(val2) {
    sorted[val][val2] = obj[val][val2]
  })
})
console.log(sorted)


0

递归版本

function sortedFunc(inputObj){
    var sorted = {}

    //get keys
    const keys = Object.keys(inputObj).sort();
    keys.forEach( key => {
       if(inputObj[key] instanceof Object){           
           sorted[key] = sortedFunc(inputObj[key]);
       } else {
           sorted[key] = inputObj[key];
    }
});
return sorted;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接