2016-11-09 4 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

Если, конечно, этот объект не является «экземпляром массива». – 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 и функцию push.

0

Вы не можете гарантировать, что порядок объектов на объекте JavaScript. Помимо Map() и используя Array, если вы хотите, чтобы этот объект знал об исходном порядке введенного массива символов, вы можете добавить свойство 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]); 
 
});

Смежные вопросы