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

Ich schreibe diese Funktion, um das int in das entsprechende Zeichen im Alphabet zu konvertieren. Jedoch erwarte ich als Ausgabe {'118': 'v', '117': 'u', '120': 'x' }, aber wenn ich den Code lief, erhalte ich: { '117': 'u', '118': 'v', '120': 'x' }. Hat jemand eine Erklärung warum ändert die Funktion die Reihenfolge der Eingabe?Konvertieren von Zahlen in die entsprechenden Buchstaben

+8

Es gibt keine garantierte Reihenfolge der Eigenschaften in einem Objekt. – Pointy

+3

Es sei denn natürlich, dass das Objekt ein 'instanceof Array' ist. – PHPglue

+0

@PHPglue auch dann, wenn die Reihenfolge wirklich nur von Code garantiert wird, der in numerischer Reihenfolge iteriert. – Pointy

Antwort

1

Siehe Does JavaScript Guarantee Object Property Order?, Nailing object property order

Verwenden 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) 
 
}

oder Array() speichern Objekte

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

Sie ordnen es als Eigenschaft eines Objekts zu (auch dynamische Eigenschaften). Daher sortiert JS es intern. Stattdessen würde ich vorschlagen, dass Sie JS-Array und seine Push-Funktion verwenden.

0

Sie können die Reihenfolge der Eigenschaften eines JavaScript-Objekts nicht garantieren. Wenn Sie neben Map() ein Array verwenden möchten, um dieses Objekt über die ursprüngliche Reihenfolge der eingegebenen Zeichencodes zu informieren, können Sie eine order-Eigenschaft hinzufügen. Indem Sie eine Referenz der beabsichtigten Reihenfolge auf dem Objekt erstellen, können Sie diese verwenden, wenn Sie beispielsweise die Werte ausdrucken möchten.

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]); 
 
});

Verwandte Themen