wake-up-neo.com

Kann ich ein Javascript-Objekt in umgekehrter Reihenfolge durchlaufen?

Ich habe also ein JavaScript-Objekt wie dieses:

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

Ich kann das so machen:

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

Durchlaufen die Eigenschaften in der Reihenfolge one> two> three.

Manchmal muss ich jedoch in umgekehrter Reihenfolge vorgehen, also möchte ich dieselbe Schleife machen, aber three> two> one.

Frage:
Gibt es eine Funktion "Objektumkehr". Wenn es sich um ein Array handelt, könnte ich mit unshift ein neues Array umkehren oder erstellen, aber ich habe keine Ahnung, was ich mit einem Objekt anfangen soll, wenn ich seine Eigenschaften umkehren muss. Irgendwelche Ideen?

Vielen Dank! 

35
frequent

Javascript-Objekte haben keine garantierte Reihenfolge, daher gibt es keine umgekehrte Reihenfolge. 

4.3.3 Objekt Ein Objekt ist ein Member vom Typ Object. Es ist eine ungeordnete Sammlung von Eigenschaften, von denen jede ein Grundelement enthält Wert, Objekt oder Funktion. Eine Funktion, die in einer Eigenschaft eines .__ gespeichert ist. Objekt wird als Methode bezeichnet.

Browser scheinen die Eigenschaften in derselben Reihenfolge zurückzugeben, in der sie dem Objekt hinzugefügt wurden. Da dies jedoch kein Standard ist, sollten Sie sich wahrscheinlich nicht auf dieses Verhalten verlassen.

Eine einfache Funktion, die eine Funktion für jede Eigenschaft in umgekehrter Reihenfolge aufruft, als die vom Browser for..in angegebene, ist:

// 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]); });

Arbeits-JsBin: http://jsbin.com/aPoBAbE/1/edit

Ich sage noch einmal, dass die Reihenfolge von for..in nicht garantiert ist, daher ist die umgekehrte Reihenfolge nicht garantiert. Vorsicht walten lassen!

38
Tibos

Es gibt keine Möglichkeit, ein Objekt rückwärts zu durchlaufen, aber wenn Sie das Objekt in umgekehrter Reihenfolge neu erstellen, sind Sie golden! Seien Sie jedoch vorsichtig, es gibt jedoch nichts, was besagt, dass die Reihenfolge des Objekts dieselbe bleibt, wie es sich ändert. Dies kann zu interessanten Ergebnissen führen, aber es funktioniert größtenteils ...

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

Machen Sie einfach den Austausch Ihres Objekts wie folgt:

MyObject = ReverseObject(MyObject);

Die Schleife würde dann so aussehen:

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

Warum hat niemandObject.keys()erwähnt?

sie können Array von Objects Eigenschaften wie geordnet erhalten, dann können Sie es mit Array-Methoden umkehren oder beliebig filtern.

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

Diese Antwort ähnelt einigen anderen, aber einige Benutzer finden den folgenden Code möglicherweise einfacher zum Kopieren und Einfügen für ihre eigenen Zwecke:

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

Für ein Objekt "foo", wie in der Frage beschrieben, gibt dieser Code die Objektelemente in umgekehrter Reihenfolge aus: "else", "thing", "some"

1
Lorien Brune

Verwenden Sie einfach Object.keys ()

Diese Funktion erledigt das für Sie:

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]])
    }
}

Beispielobjekt:

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

Schleife in der Reihenfolge:

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

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

Schleife rückwärts:

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

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