2016-11-09 80 views
1
function numObj(s){ 
    var emptyObj = {}; 
    s.forEach(function(num) { 
     emptyObj[num] = String.fromCharCode(num); 
    }); 
    return emptyObj; 
} 
console.log(numObj([118,117,120])); 

我正在寫這個函數來將int轉換爲字母表中相應的字符。但是, 我期待作爲輸出{'118': 'v', '117': 'u', '120': 'x' },但是當我運行代碼時,我得到:{ '117': 'u', '118': 'v', '120': 'x' }。有沒有人有任何解釋爲什麼該功能改變輸入的順序?將數字轉換爲相應的字母

+8

有一個對象的屬性沒有保證的順序。 – Pointy

+3

當然,除非Object是''instanceof Array''。 – PHPglue

+0

@PHPglue儘管如此,排序實際上只能由數字順序迭代的代碼來保證。 – Pointy

回答

1

Does JavaScript Guarantee Object Property Order?Nailing object property order

使用Map()

function numObj(s){ 
 
    let emptyObj = new Map(); 
 
    s.forEach(function(num) { 
 
     emptyObj.set(num, {[num]:String.fromCharCode(num)}); 
 
    }); 
 
    return emptyObj; 
 
} 
 
let obj = numObj([118,117,120]); 
 

 
for (let [key, value] of obj.entries()) { 
 
    console.log(key, value) 
 
}

Array()來存儲對象

function numObj(s){ 
 
    let emptyObj = Array.from({length:s.length}); 
 
    s.forEach(function(num, i) { 
 
     emptyObj[i] = {[num]:String.fromCharCode(num)}; 
 
    }); 
 
    return emptyObj; 
 
} 
 
let obj = numObj([118,117,120]); 
 

 
for (let [key, value] of obj.entries()) { 
 
    console.log(key, value) 
 
}

0

您將其指定爲對象的屬性(即使是動態屬性)。因此JS在內部進行排序。相反,我會建議你使用JS數組及其推送功能。

0

您無法保證JavaScript對象上屬性的順序。除了Map()和使用數組,如果您想讓此對象知道輸入的字符代碼數組的原始順序,您可以添加order屬性。通過在對象上創建預期順序的引用,可以在執行諸如打印值之類的操作時使用它。

function numObj(s){ 
 
    var emptyObj = {}; 
 
    emptyObj.order = []; 
 
    s.forEach(function(num) { 
 
    emptyObj[num] = String.fromCharCode(num); 
 
    emptyObj.order.push(num); 
 
    }); 
 

 
    return emptyObj; 
 
} 
 

 
var obj = numObj([118,117,120]); 
 

 
obj.order.forEach(function(i){ 
 
    console.log(i + " : " + obj[i]); 
 
});