【问题标题】:Can I loop through a javascript object in reverse order?我可以以相反的顺序循环遍历 javascript 对象吗?
【发布时间】:2013-09-29 10:46:41
【问题描述】:

所以我有一个这样的 JavaScript 对象:

foo = {
  "one": "some",
  "two": "thing",
  "three": "else"
};

我可以这样循环:

for (var i in foo) {
  if (foo.hasOwnProperty(i)) {
    // do something
  }
}

它将按照one > two > three 的顺序循环遍历属性。

但是有时我需要以相反的顺序进行,所以我想做同样的循环,但是three > two > one

问题:
是否有“对象反转”功能。如果它是一个数组,我可以使用unshift 反转或构建一个新数组,但是当我需要反向循环它的属性时,我不知道如何处理一个对象。有什么想法吗?

谢谢!

【问题讨论】:

  • 我不会依赖任何关于对象键的顺序。如果需要,请使用 Object.keys() 提取密钥,对它们进行排序,然后按排序顺序访问属性。
  • 嗯。好主意。让我们试试
  • 另请阅读:thisthis

标签: javascript object for-loop properties reverse


【解决方案1】:

这个答案与其他几个答案相似,但一些用户可能会发现下面的代码更容易复制粘贴以供自己使用:

Object.keys(foo).reverse().forEach(function(key) { console.log(foo[key]) });

对于问题中描述的对象“foo”,此代码将以相反的顺序输出对象元素:“else”、“thing”、“some”

【讨论】:

    【解决方案2】:

    为什么没有人提到Object.keys()

    您可以按原样获取对象的 Array 属性,然后您可以使用 Array 方法对其进行反转或过滤。

    let foo = {
      "one": "some",
      "two": "thing",
      "three": "else"
    };
    
    // Get REVERSED Array of Propirties
    let properties = Object.keys(foo).reverse();
    // "three"
    // "two"
    // "one"
    
    // Then you could use .forEach / .map
    properties.forEach(prop => console.log(`PropertyName: ${prop}, its Value: ${foo[prop]}`));
    
    // PropertyName: three, its Value: else
    // PropertyName: two, its Value: thing
    // PropertyName: one, its Value: some

    【讨论】:

    • 这也是我的猜测。我只是很困惑这个答案的支持率太低了。这个解决方案有什么问题吗? (尽管不能保证订单)
    • 真的很喜欢这个答案
    【解决方案3】:

    Javascript 对象没有保证的固有顺序,因此不存在“反向”顺序。

    4.3.3 对象 对象是对象类型的成员。它是一个无序集合的属性,每个属性都包含一个基元 值、对象或函数。存储在属性中的函数 对象被称为方法。

    浏览器似乎确实按照它们添加到对象的顺序返回属性,但由于这不是标准的,您可能不应该依赖这种行为。

    一个简单的函数,它以与浏览器的 for..in 给出的相反顺序为每个属性调用一个函数,是这样的:

    // f is a function that has the obj as 'this' and the property name as first parameter
    function reverseForIn(obj, f) {
      var arr = [];
      for (var key in obj) {
        // add hasOwnPropertyCheck if needed
        arr.push(key);
      }
      for (var i=arr.length-1; i>=0; i--) {
        f.call(obj, arr[i]);
      }
    }
    
    //usage
    reverseForIn(obj, function(key){ console.log('KEY:', key, 'VALUE:', this[key]); });
    

    工作 JsBin:http://jsbin.com/aPoBAbE/1/edit

    我再说一遍 for..in 的顺序是不能保证的,所以相反的顺序是不能保证的。谨慎使用!

    【讨论】:

    • 我最终使用数组而不是对象,因为它更容易排序和反转。还是谢谢
    • 明智的选择。您的用例听起来更适合数组。
    • 喜欢这个解决方案。我不得不使用一个对象,所以...谢谢伙计,你应该得到更多的支持。
    • 顺序似乎与输入的一样,但是,如果您的键是数字,它们似乎按升序循环。这是我能找到的唯一一种情况,其中顺序可能与您向对象添加属性的方式不同。所以循环遍历 'var obj = {2: "two", 1: "one", 3: "three"}' 会显示 'onetwothree',而不是 'twoonethree'。只是观察!
    【解决方案4】:

    没有办法向后循环对象,但如果你以相反的顺序重新创建对象,那么你就是黄金!但是请注意,没有什么可以说明对象的顺序会随着它的变化而保持不变,因此这可能会导致一些有趣的结果,但在大多数情况下它是有效的......

    function ReverseObject(Obj){
        var TempArr = [];
        var NewObj = [];
        for (var Key in Obj){
            TempArr.push(Key);
        }
        for (var i = TempArr.length-1; i >= 0; i--){
            NewObj[TempArr[i]] = [];
        }
        return NewObj;
    }
    

    只需像这样对您的对象进行交换-

    MyObject = ReverseObject(MyObject);
    

    然后循环看起来像这样-

    for (var KeysAreNowBackwards in MyObject){
        alert(MyObject[KeysAreNowBackwards]);
    } 
    

    【讨论】:

    • 我想建议一些更改:第 3 行 var NewObj = {} 这样我们返回对象而不是数组,第 8 行 @ 987654325@ 因为您的代码返回空数组
    猜你喜欢
    • 2011-11-02
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多