2016-11-09 79 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]); 
 
});