【问题标题】:Sorting alphabetically an object of objects through keys in Javascript通过Javascript中的键按字母顺序对对象对象进行排序
【发布时间】:2019-07-18 13:10:21
【问题描述】:

我有这个嵌套对象,我想按字母顺序排序,

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]
})

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

【问题讨论】:

标签: javascript sorting object foreach


【解决方案1】:

您可以对嵌套对象采用递归方法。

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
  • 是的,是的,我被缩进弄糊涂了
【解决方案2】:

先赋值一个空对象,再添加排序属性。

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]
  })
})

完成sn-p:

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)

【讨论】:

    【解决方案3】:

    递归版本

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-25
      • 2013-10-28
      • 2018-12-03
      • 2019-06-15
      • 2023-01-30
      • 2014-12-30
      • 2021-04-23
      • 1970-01-01
      相关资源
      最近更新 更多