簡體   English   中英

我可以以相反的順序循環瀏覽javascript對象嗎?

[英]Can I loop through a javascript object in reverse order?

所以我有一個像這樣的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 ,但我有什么用一個對象做什么,當我需要反向循環它的屬性丟失。 有任何想法嗎?

謝謝!

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

工作JsBin: http ://jsbin.com/aPoBAbE/1/edit

我再次說for..in的順序不能保證,所以不保證相反的順序。 謹慎使用!

沒有辦法向后循環一個對象,但如果你以相反的順序重新創建對象,那么你就是金色! 但要注意的是,沒有任何東西可以說對象的順序會隨着它的變化保持不變,所以這可能會產生一些有趣的結果,但是大多數情況下它都有效......

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

為什么沒有人提到過Object.keys()

您可以按原樣獲取對象的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 

只需使用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"

這個答案類似於其他幾個,但有些用戶可能會發現下面的代碼更容易復制粘貼以供自己使用:

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

對於問題中描述的對象“foo”,此代碼將以相反的順序輸出對象元素:“else”,“thing”,“some”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM