我可以以相反的顺序循环遍历 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 对象吗?的主要内容,如果未能解决你的问题,请参考以下文章