[英]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.