function numObj(s){
var emptyObj = {};
s.forEach(function(num) {
emptyObj[num] = String.fromCharCode(num);
});
return emptyObj;
}
console.log(numObj([118,117,120]));
我正在编写此函数以将int转换为字母表中对应的char。然而,
我期待作为输出{'118': 'v', '117': 'u', '120': 'x' }
,但当我运行代码时,我得到:{ '117': 'u', '118': 'v', '120': 'x' }
。有没有人有任何解释为什么函数改变输入的顺序?
答案 0 :(得分: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)
}

答案 1 :(得分:0)
您将其指定为对象的属性(甚至是动态属性)。因此JS在内部对其进行排序。相反,我建议你使用JS数组及其推送功能。
答案 2 :(得分: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]);
});