web-dev-qa-db-fra.com

Puis-je parcourir un objet javascript dans l'ordre inverse?

J'ai donc un objet JavaScript comme ceci:

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

Je peux faire une boucle comme ceci:

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

Ce qui va parcourir les propriétés dans l'ordre de one> two> three.

Cependant, parfois, j'ai besoin de passer dans l'ordre inverse, je voudrais donc faire la même boucle, mais three> two> one.

Question:
Existe-t-il une fonction "object-reverse"? Si c'était un tableau, je pourrais inverser ou construire un nouveau tableau avec unshift mais je ne sais plus quoi faire avec un objet, lorsque j'ai besoin d'inverser en boucle ses propriétés. Des idées?

Merci! 

35
frequent

Les objets Javascript n’ont pas d’ordre inhérent garanti, il n’existe donc pas d’ordre «inverse». 

4.3.3 Objet Un objet est un membre du type Objet. C'est une collection non ordonnée de propriétés, chacune d'entre elles contenant une primitive valeur, objet ou fonction. Une fonction stockée dans une propriété d'un objet s'appelle une méthode.

Les navigateurs semblent renvoyer les propriétés dans le même ordre où ils ont été ajoutés à l'objet, mais comme cela n'est pas standard, vous ne devriez probablement pas compter sur ce comportement.

Une fonction simple qui appelle une fonction pour chaque propriété dans l'ordre inverse de celui donné par le navigateur pour..in, est la suivante:

// 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 de travail: http://jsbin.com/aPoBAbE/1/edit

Encore une fois je dis que l'ordre de for..in n'est pas garanti, donc l'ordre inverse n'est pas garanti. Utiliser avec précaution!

38
Tibos

Il n'y a aucun moyen de parcourir en boucle un objet, mais si vous le recréez dans l'ordre inverse, vous êtes dorés! Attention cependant, rien n'indique que l'ordre de l'objet restera le même à mesure qu'il change. Cela peut donc aboutir à un résultat intéressant, mais dans la plupart des cas cela fonctionne ...

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;
}

Il suffit de faire l’échange sur votre objet comme ceci-

MyObject = ReverseObject(MyObject);

La boucle ressemblerait alors à ceci-

for (var KeysAreNowBackwards in MyObject){
    alert(MyObject[KeysAreNowBackwards]);
} 
5
user3324764

Pourquoi personne n’a mentionnéObject.keys()?

vous pouvez obtenir Array des propriétés de l'objet ordonnées telles quelles, vous pouvez ensuite l'inverser ou le filtrer à votre guise avec les méthodes 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

2
Maged Mohamed

Il suffit d'utiliser Object.keys ()

Cette fonction s'en occupera pour vous:

function loopObject(obj, reverse, logic){
    let keys = reverse? Object.keys(obj).reverse() : Object.keys(obj)
    for(let i=0;i<keys.length;i++){
        logic(obj[keys[i]])
    }
}

Exemple d'objet:

let my_object = {
    one: 'one',
    two: 'two',
    three: 'three'
}

Boucle dans l'ordre:

loopObject(my_object, false, val => {
    console.log(val) // Insert your logic here.
})

// "one"
// "two"
// "three"

Boucle en sens inverse:

loopObject(my_object, true, val => {
    console.log(val) // Insert your logic here.
})

// "three"
// "two"
// "one"
0
Mike Tromba