web-dev-qa-db-ja.com

オブジェクトキーとして数値型を使用する方法はありますか?

オブジェクトのキー名として数値型を使用すると、常に文字列に変換されるようです。とにかくそれを実際に数値として保存する方法はありますか?通常の型キャストは機能しないようです。

例:

var userId = 1;
console.log( typeof userId ); // number
myObject[userId] = 'a value';
console.dir(myObject);

Dir出力:

{
    '1': 'a value'
}

私がwantとするものは:

{
    1: 'a value'
}

助言?

ありがとう

69
Spot

いいえ、これは不可能です。 キーは常に文字列に変換されます。Property Accessor docs を参照してください

プロパティ名は文字列でなければなりません。これは、非文字列オブジェクトをオブジェクトのキーとして使用できないことを意味します。数値を含む文字列以外のオブジェクトは、toStringメソッドを介して文字列に型キャストされます。

> var foo = {}
undefined

> foo[23213] = 'Swag'
'Swag'

> foo
{ '23213': 'Swag' }

> typeof(Object.keys(foo)[0])
'string'
74

オブジェクトではありませんが、このアプリケーションでは Map が非常に役立つことがわかりました。ここでは、キーベースのイベントである数値キーに使用しました。

onKeydown(e) {
  const { toggleSidebar, next, previous } = this.props;

  const keyMapping = new Map([
    [ 83, toggleSidebar ],  // user presses the s button
    [ 37, next          ],  // user presses the right arrow
    [ 39, previous      ]   // user presses the left arrow
  ]);

  if (keyMapping.has(e.which)) {
    e.preventDefault();
    keyMapping.get(e.which)();
  }
}
14
corvid

ECMA-262-5の設計によると思われます:

プロパティ識別子タイプは、プロパティ名をプロパティ記述子に関連付けるために使用されます。プロパティ識別子タイプの値は、フォーム(名前、記述子)のペアです。名前は文字列で、記述子はプロパティ記述子の値です。

ただし、ECMA-262-3には明確な仕様がありません。とにかく、文字列以外をプロパティ名として使用するつもりはありません。

9
Rob Olmos

このようなものが必要ですか?

var userId = 1;var myObject ={};
console.log( typeof userId ); // number
myObject[userId] = 'a value';
console.dir(myObject);

コンソール:オブジェクト

1:「値」

1

上記のことを数字としてアクセスするために使用したい場合、次のことができると思います、私は同じことをして働いた。

var myObj = {"0":"a","1":"b","CNT":2};
$.each(myObj,function(key,value){
     if(isNaN(parseInt(key))){
          return true; //continue;
     }
     //Code to perform operation
}

これは、キーが数字で始まらない場合にのみ機能します。そうでない場合は、数字に変換されます。次の例を参照してください。

parseInt("45kjghk") === 45

ここでjQueryを使用しました


更新:

var myObj = {"0":"a","1":"b","CNT":2};
$.each(myObj,function(key,value){
     if(isNaN(parseInt(key)) || (key.length !== parseInt(key).toString().length) ){
          return true; //continue;
     }
     //Code to perform operation
}

上記の問題を克服する可能性があります。利用可能な場合はより適切に提案し、この回答に問題がある場合は提案してください。

0
Shivam Sharma