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

は、オブジェクトに

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) 
 
}
を保存するために 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()を参照してください。

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

関連する問題