Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我能以相反的顺序循环遍历javascript对象吗?_Javascript_Object_For Loop_Properties_Reverse - Fatal编程技术网

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

我能以相反的顺序循环遍历javascript对象吗?,javascript,object,for-loop,properties,reverse,Javascript,Object,For Loop,Properties,Reverse,我有一个JavaScript对象,如下所示: foo = { "one": "some", "two": "thing", "three": "else" }; 我可以这样循环: for (var i in foo) { if (foo.hasOwnProperty(i)) { // do something } } 它将按onetwotwotwo的顺序循环遍历属性 然而,有时我需要以相反的顺序进行,因此我希望执行相同的循环,但是321 问题: 是否有“对象反转”

我有一个JavaScript对象,如下所示:

foo = {
  "one": "some",
  "two": "thing",
  "three": "else"
};
我可以这样循环:

for (var i in foo) {
  if (foo.hasOwnProperty(i)) {
    // do something
  }
}
它将按
one
two
two
two
的顺序循环遍历属性

然而,有时我需要以相反的顺序进行,因此我希望执行相同的循环,但是
3
2
1

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


谢谢

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:


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

没有向后循环对象的方法,但是如果以相反的顺序重新创建对象,那么您就是黄金!但是,请注意,没有任何东西表明对象的顺序在发生变化时会保持不变,因此这可能会导致一些有趣的结果,但在大多数情况下,它是有效的

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]);
} 
然后,循环将如下所示-

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

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

可以按原样获得对象属性的数组,然后可以使用数组方法对其进行反转或过滤

让foo={
“一个”:“一些”,
“二”:“东西”,
“三”:“其他”
};
//获取属性的反向数组
让properties=Object.keys(foo.reverse();
//“三个”
//“两个”
//“一个”
//然后可以使用.forEach/.map
property.forEach(prop=>console.log(`PropertyName:${prop},其值:${foo[prop]}`);
//PropertyName:three,其值为else
//PropertyName:二,它的价值:东西

//PropertyName:one,其值:一些
此答案与其他两个答案类似,但一些用户可能会发现下面的代码更容易复制粘贴以供自己使用:

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

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

我不依赖对象键的任何顺序。如果需要,请使用
Object.keys()
提取密钥,对它们进行排序,然后按排序顺序访问属性。好主意。让我们试着读一下:我最终使用了数组而不是对象,因为它更容易排序和反转。谢谢你的明智选择。您的用例听起来更适合使用数组。喜欢这个解决方案。我必须使用一个对象,所以。。。谢谢你,伙计,你应该得到更多的向上投票。但是,如果你的键是数字,它们似乎会以升序循环通过。这是我能找到的唯一一种顺序可能与向对象添加属性的方式不同的情况。因此,循环通过'var obj={2:two',1:one',3:three}'将显示'onetwotree',而不是'twonetwree'。只是一个观察!我想建议做一些修改:第3行
var NewObj={}
这样我们返回object而不是数组,第8行
NewObj[TempArr[I]=Obj[TempArr[I]]