有没有办法对JavaScript对象中的键进行排序/排序?

有没有办法对JavaScript对象中的键进行排序/排序?,javascript,Javascript,例如下面的例子 var data = { 'States': ['NSW', 'VIC'], 'Countries': ['GBR', 'AUS'], 'Capitals': ['SYD', 'MEL'] } for (var item in data) { console.log(item); } 印刷品 States Countries Capitals 有没有办法按字母顺序排序以便打印 Capitals Countries States 不在对象本身内

例如下面的例子

var data = {
    'States': ['NSW', 'VIC'],
    'Countries': ['GBR', 'AUS'],
    'Capitals': ['SYD', 'MEL']
}
for (var item in data) {
    console.log(item);
}
印刷品

States
Countries
Capitals
有没有办法按字母顺序排序以便打印

Capitals
Countries
States

不在对象本身内:对象的属性集合是无序的

您可以做的一件事是使用
Object.keys()
,对数组排序,然后迭代它

Object.keys(data)
      .sort()
      .forEach(function(v, i) {
          console.log(v, data[v]);
       });
不支持ECMAScript第5版的浏览器的修补程序(实现):


  • 是的,有。不在ECMAScript标准中,但支持跨浏览器和Node.js,而且显然是稳定的。看

    编辑:返回一个对象,其中键是按顺序排列的。您可以使用
    Object.keys(…)
    从对象中获取已排序的键

    为什么要担心对象键顺序?这种差异在某些应用程序中可能很重要,例如解析XML,将XML表示为嵌套对象,并使用XML标记作为哈希键

    这里有几个注意事项:

    • 看起来像整数的键首先以数字顺序出现
    • 看起来像字符串的键将按插入顺序显示在下一步
    • 此顺序由
      Object.keys(obj)
    • for(obj中的var键){…}
      报告的顺序在Safari、Firefox中可能不同
    函数返回按字母顺序插入排序键的对象:

    function orderKeys(obj, expected) {
    
      var keys = Object.keys(obj).sort(function keyOrder(k1, k2) {
          if (k1 < k2) return -1;
          else if (k1 > k2) return +1;
          else return 0;
      });
    
      var i, after = {};
      for (i = 0; i < keys.length; i++) {
        after[keys[i]] = obj[keys[i]];
        delete obj[keys[i]];
      }
    
      for (i = 0; i < keys.length; i++) {
        obj[keys[i]] = after[keys[i]];
      }
      return obj;
    }
    
    这是回报

    { '3': 'charlie',
      '5': 'eagle',
      apples: 'e',
      berries: 'e',
      'p:nvSpPr': 'a',
      'p:spPr': 'b',
      'p:style': 'c',
      'p:txBody': 'd' }
    
    然后,您可以通过以下方式获取已排序的密钥:

    Object.keys(obj) 
    
    返回

    ["3", "5", "apples", "berries", "p:nvSpPr", "p:spPr", "p:style", "p:txBody"]
    

    如果转换为数组不适合您的模板,并且您知道对象的键,也可以执行以下操作:

    在控制器中,按正确顺序定义键的数组:

    this.displayOrder = [
        'firstKey',
        'secondKey',
        'thirdKey'
    ];
    
    在模板中,重复displayOrder的键,然后使用ng init引用回对象

    <div ng-repeat="key in ctrl.displayOrder" ng-init="entry = ctrl.object[key]">
         {{ entry.detail }}
    </div>
    
    
    {{entry.detail}
    
    这里有一个很好的功能解决方案:

    基本上

  • 使用
    Object.keys
  • 排序
  • 将列表还原为对象以获得所需的结果
  • ES5解决方案:

    not_sorted={b:false,a:true};
    排序=对象。键(未排序)
    .sort()
    .reduce(功能(acc,键){
    acc[键]=未排序[键];
    返回acc;
    }, {});
    console.log(排序)/{a:true,b:false}
    
    ES6解决方案:

    not_sorted={b:false,a:true}
    排序=对象。键(未排序)
    .sort()
    .减少((附件,钥匙)=>({
    …acc[键]:未排序[键]
    }), {})
    console.log(排序)/{a:true,b:false}
    
    这里有一个单行程序,可以使用

    使用您的示例数据:

    var data = {
        'States': ['NSW', 'VIC'],
        'Countries': ['GBR', 'AUS'],
        'Capitals': ['SYD', 'MEL']
    }
    data = _.chain(data)
      .toPairs() // turn the object into an array of [key, value] pairs
      .sortBy(0) // sort these pairs by index [0] which is [key]
      .fromPairs() // convert array of pairs back into an object {key: value}
      .value() // return value
    /*
    {
      Capitals: [ 'SYD', 'MEL' ],
      Countries: [ 'GBR', 'AUS' ],
      States: [ 'NSW', 'VIC' ]
    }
    */
    
    

    我想将此作为评论添加到的帖子中,但我的代表级别不够高

    如果任何人需要符合以下要求的
    orderKeys
    版本:

    /**
    *返回并修改输入对象,以便按排序方式返回其键
    *调用`Object.keys(obj)`时的顺序
    *
    *@param{object}obj将对象的键排序
    *
    *@返回{object}输入的对象及其键的排序顺序
    */
    常量orderKeys=(obj)=>{
    //符合“no param reassign”,JavaScript似乎在这里通过引用进行分配
    const newObj=obj;
    //默认的“.sort()”链式方法似乎适合我
    const keys=Object.keys(newObj.sort();
    const after={};
    //按'obj'键的排序顺序将键添加到'after'
    key.forEach((key)=>{
    [key]之后=newObj[key];
    删除newObj[key];
    });
    //按排序顺序将键添加回'obj'
    key.forEach((key)=>{
    newObj[key]=在[key]之后;
    });
    返回newObj;
    };
    
    使用的测试:

    const示例={
    3:‘查理’,
    ‘p:style’:‘c’,
    浆果:“e”,
    “p:nvSpPr”:“a”,
    “p:txBody”:“d”,
    苹果:“e”,
    5.‘鹰’,
    p:spPr:'b'
    }
    const obj=顺序键(示例);
    控制台日志(obj);
    console.log(Object.keys(obj));
    
    产出如下:

    Babel Compiler v6.4.4
    Copyright (c) 2014-2015 Sebastian McKenzie
    
    { 3: 'charlie',
      5: 'eagle',
      apples: 'e',
      berries: 'e',
      'p:nvSpPr': 'a',
      'p:spPr': 'b',
      'p:style': 'c',
      'p:txBody': 'd' }
    [ '3',
      '5',
      'apples',
      'berries',
      'p:nvSpPr',
      'p:spPr',
      'p:style',
      'p:txBody' ]
    

    不管它值多少钱,我都需要在我的React应用程序中使用它,这样我就可以根据
    状态
    对象对下拉列表中的选项进行排序,该对象是在我的API响应之后分配的

    起初我是这样做的

    return (
      // ...
      <Select
        options={Object.keys(obj).sort()}
        // ...
      />
      // ...
    );
    
    返回(
    // ...
    // ...
    );
    
    但是意识到每次重新渲染时都会调用
    .sort()
    方法,因此需要实现
    orderKeys


    您也可以用这种方式对其进行排序

    const data = {
      States: ['NSW', 'VIC'],
      Countries: ['GBR', 'AUS'],
      Capitals: ['SYD', 'MEL']
    }
    
    const sortedObject = Object.fromEntries(Object.entries(data).sort())
    
    我无法详细解释为什么它能工作,但显然它工作得完美无缺:)如果你不相信我,试试你自己:D

    请注意,您的浏览器或Node.js版本应支持
    Object.fromEntries

    有关浏览器兼容性,请检查

    对于Node,它将适用于12及更高版本。
    对于v1中的Deno。

    值得一看:可能的副本也值得一看:值得添加。如果希望颠倒排序顺序,可以将.sort()替换为.replace()。此外,sort()和reverse()接受比较函数作为参数,允许您微调排序@CharlesJaimet:不确定你所说的
    .replace()
    是什么意思。你是说
    .reverse()
    ?这确实可以使用,但前提是您希望当前顺序颠倒。如果要颠倒排序顺序,则必须首先对其进行排序。
    .sort()
    方法确实接受函数,但是
    .reverse()
    不接受。谢谢@squint。打字太快,思考太慢。:)这解决了我的问题,但我想知道函数(v,I)中的
    I
    参数是什么represents@WillCarron:它是当前迭代的数字索引。因此,如果有3个键,
    i
    将在每次调用回调时分别给出
    0
    1
    2
    。因为函数中没有使用
    i
    ,所以可以安全地删除它,因为JS从不要求您为传递的所有或任何参数提供参数。使用brow中可用的日志记录工具
    return (
      // ...
      <Select
        options={Object.keys(obj).sort()}
        // ...
      />
      // ...
    );
    
    const data = {
      States: ['NSW', 'VIC'],
      Countries: ['GBR', 'AUS'],
      Capitals: ['SYD', 'MEL']
    }
    
    const sortedObject = Object.fromEntries(Object.entries(data).sort())