我可以以相反的顺序循环遍历 javascript 对象吗?

Posted

技术标签:

【中文标题】我可以以相反的顺序循环遍历 javascript 对象吗?【英文标题】:Can I loop through a javascript object in reverse order? 【发布时间】: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() 提取密钥,对它们进行排序,然后按排序顺序访问属性。 嗯。好主意。让我们试试 另请阅读:this 和 this 【参考方案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@ 因为您的代码返回空数组

以上是关于我可以以相反的顺序循环遍历 javascript 对象吗?的主要内容,如果未能解决你的问题,请参考以下文章

在Python中以相反的顺序遍历列表

以相反的顺序遍历现有的标准优先级队列

如何以相反的顺序快速迭代for循环?

添加下一个按钮以循环遍历javascript中的元素

数组①数组遍历与属性

csharp 示例演示如何使用for循环以相反顺序迭代数组。从计算机编程基础知识到C#http:/