47

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

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

我可以这样循环:

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

它将按one>>的顺序遍历属性twothree

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

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

谢谢!

4

5 回答 5

40

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 的顺序是不能保证的,所以相反的顺序是不能保证的。谨慎使用!

于 2013-09-24T09:48:02.783 回答
25

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

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

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

于 2018-11-05T19:14:17.387 回答
6

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

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]);
} 
于 2015-09-29T14:45:37.403 回答
5

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

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

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

于 2019-07-13T15:41:59.113 回答
0

您可以使用

Object.keys

需要注意的一件事是它返回一个排序的键列表(如果键是数字的)。您可能需要相应地更改它。

a =   {'d':'stack','l':'overflow','b':'out','a':'first','z':'empty'}
out = Object.keys(a).reverse()
console.warn("When key contains characters : "+out)

a =   {'1':'stack','4':'overflow','2':'out','5':'first','3':'empty'}
out = Object.keys(a).reverse()
console.warn("When key is a numerical string : "+out)

于 2022-01-26T09:20:04.840 回答