objetos - ¿Puedo recorrer un objeto javascript en orden inverso?
object.keys javascript (2)
Entonces tengo un objeto JavaScript como este:
foo = {
"one": "some",
"two": "thing",
"three": "else"
};
Puedo repetir esto como sigue:
for (var i in foo) {
if (foo.hasOwnProperty(i)) {
// do something
}
}
Que recorrerá las propiedades en el orden de one
> two
> three
.
Sin embargo, a veces tengo que pasar en orden inverso, así que me gustaría hacer el mismo ciclo, pero three
> two
> one
.
Pregunta:
¿Hay una función de "objeto inverso"? Si fuera una matriz, podría revertir o construir una nueva matriz sin unshift
pero estoy perdido con qué hacer con un objeto, cuando necesito invertir sus propiedades. ¿Algunas ideas?
¡Gracias!
Los objetos Javascript no tienen un orden inherente garantizado, por lo que no existe un orden "inverso".
4.3.3 Objeto Un objeto es un miembro del tipo Objeto. Es una colección desordenada de propiedades, cada una de las cuales contiene un valor primitivo, objeto o función. Una función almacenada en una propiedad de un objeto se llama método.
Los navegadores parecen devolver las propiedades en el mismo orden en que se agregaron al objeto, pero como esto no es estándar, probablemente no deberías confiar en este comportamiento.
Una función simple que llama a una función para cada propiedad en orden inverso a la dada por el navegador para ...in, es esta:
// 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]); });
Trabajando JsBin: http://jsbin.com/aPoBAbE/1/edit
De nuevo, digo que el orden de for..in no está garantizado, por lo que el orden inverso no está garantizado. Usar con precaución!
No hay forma de recorrer un objeto hacia atrás, pero si recreas el objeto en orden inverso, ¡entonces estás dorado! Tenga cuidado, sin embargo, no hay nada que diga que el orden del objeto permanecerá igual ya que cambia y esto puede conducir a un resultado interesante, pero en su mayor parte funciona ...
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;
}
Simplemente haga el cambio en su objeto de esta manera-
MyObject = ReverseObject(MyObject);
El ciclo se vería así:
for (var KeysAreNowBackwards in MyObject){
alert(MyObject[KeysAreNowBackwards]);
}