我可以以相反的顺序循环浏览javascript对象吗?

fre*_*ent 41 javascript reverse for-loop properties object

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

foo = {
  "one": "some",
  "two": "thing",
  "three": "else"
};
Run Code Online (Sandbox Code Playgroud)

我可以循环这样:

for (var i in foo) {
  if (foo.hasOwnProperty(i)) {
    // do something
  }
}
Run Code Online (Sandbox Code Playgroud)

这将遍历的顺序性one> two> three.

不过有时我需要以相反的顺序穿过去,所以我希望做同样的循环,但three> two> one.

问题:
是否存在"对象反转"功能.如果它是一个数组,我可以反转或构建一个新数组,unshift但是当我需要反向循环它的属性时,我迷失了对象的操作.有任何想法吗?

谢谢!

Tib*_*bos 39

Javascript对象没有保证的固有顺序,因此不存在"反向"顺序.

4.3.3对象对象是Object类型的成员.它是一个无序的属性集合,每个属性都包含一个原始值,对象或函数.存储在对象属性中的函数称为方法.

浏览器确实以与添加到对象相同的顺序返回属性,但由于这不是标准,因此您可能不应该依赖此行为.

一个简单的函数,它以与浏览器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]); });
Run Code Online (Sandbox Code Playgroud)

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

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


Mag*_*med 23

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

您可以获得按原样排序的对象属性数组,然后您可以使用 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
Run Code Online (Sandbox Code Playgroud)


cta*_*tay 5

没有办法向后循环一个对象,但如果你以相反的顺序重新创建对象,那么你就是金色!但要注意的是,没有任何东西可以说对象的顺序会随着它的变化保持不变,所以这可能会产生一些有趣的结果,但是大多数情况下它都有效......

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;
}
Run Code Online (Sandbox Code Playgroud)

只需像你这样交换你的对象 -

MyObject = ReverseObject(MyObject);
Run Code Online (Sandbox Code Playgroud)

然后循环看起来像这样 -

for (var KeysAreNowBackwards in MyObject){
    alert(MyObject[KeysAreNowBackwards]);
} 
Run Code Online (Sandbox Code Playgroud)

  • 我想要一些改变建议:_line 3_` var NewObj = {}`这样我们返回对象而不是数组,_ line 8_`NewObj [TempArr [i]] = Obj [TempArr [i]];`因为你的代码返回空数组 (3认同)

Lor*_*une 5

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

Object.keys(foo).reverse().forEach(function(key) { console.log(foo[key]) });
Run Code Online (Sandbox Code Playgroud)

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