web-dev-qa-db-ja.com

javascriptオブジェクトを逆順でループできますか?

したがって、次のようなJavaScriptオブジェクトがあります。

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

私はこれを次のようにループできます:

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

one> two> threeの順にプロパティをループします。

ただし、逆の順序で処理する必要がある場合があるため、同じループを実行したいのですが、three> two> oneです。

質問:
「オブジェクト反転」機能があります。配列の場合、unshiftを使用して新しい配列を反転または構築できますが、そのプロパティを逆ループする必要があるときにオブジェクトをどう処理するか迷っています。何か案は?

ありがとう!

40
frequent

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

Working JsBin: http://jsbin.com/aPoBAbE/1/edit

繰り返しますが、for..inの順序は保証されていないため、逆の順序は保証されていません。注意して使用してください!

38
Tibos

オブジェクトを逆方向にループする方法はありませんが、オブジェクトを逆の順序で再作成すると、黄金になります!ただし、注意してください、オブジェクトの順序が変化しても変わらないということはないため、興味深い結果が得られる可能性がありますが、ほとんどの場合は機能します...

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

なぜ誰も言及していないのはObject.keys()

objectのプロパティのArrayをそのままの順序で取得し、それを逆にしたり、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

Object.keys()を使用するだけです

この関数はあなたのためにそれの世話をします:

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

オブジェクトの例:

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

順番にループ:

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

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

逆のループ:

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

// "three"
// "two"
// "one"
1
Mike Tromba

この回答は他の2、3の回答と似ていますが、一部のユーザーは、以下のコードを自分の用途に合わせてコピーアンドペーストする方が簡単だと感じるかもしれません。

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

質問で説明されているオブジェクト「foo」の場合、このコードはオブジェクト要素を「else」、「thing」、「some」の逆の順序で出力します

1
Lorien Brune