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: someRun Code Online (Sandbox Code Playgroud)
没有办法向后循环一个对象,但如果你以相反的顺序重新创建对象,那么你就是金色!但要注意的是,没有任何东西可以说对象的顺序会随着它的变化保持不变,所以这可能会产生一些有趣的结果,但是大多数情况下它都有效......
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)
这个答案与其他几个相似,但有些用户可能会发现下面的代码更容易复制粘贴以供自己使用:
Object.keys(foo).reverse().forEach(function(key) { console.log(foo[key]) });
Run Code Online (Sandbox Code Playgroud)
对于问题中描述的对象“foo”,此代码将以相反的顺序输出对象元素:“else”、“thing”、“some”