Apakah ada cara untuk menggunakan tipe numerik sebagai kunci objek?

104

Tampaknya ketika saya menggunakan tipe numerik sebagai nama kunci dalam sebuah objek, itu selalu diubah menjadi string. Apakah ada cara untuk menyimpannya dalam bentuk numerik? Typecasting normal sepertinya tidak berfungsi.

Contoh:

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

Keluaran Dir:

{
    '1': 'a value'
}

Yang saya inginkan adalah ini:

{
    1: 'a value'
}

Nasihat?

Titik
sumber
Juga lihat komentar ini - stackoverflow.com/questions/3633362/…
Manohar Reddy Poreddy

Jawaban:

114

Tidak, ini tidak mungkin. Kuncinya akan selalu diubah menjadi string. Lihat dokumen Pengakses Properti

Nama properti harus berupa string. Ini berarti bahwa objek non-string tidak dapat digunakan sebagai kunci dalam objek tersebut. Objek non-string apa pun, termasuk angka, diketik menjadi string melalui metode toString.

> var foo = {}
undefined

> foo[23213] = 'swag'
'swag'

> foo
{ '23213': 'swag' }

> typeof(Object.keys(foo)[0])
'string'
Matthew Flaschen
sumber
1
Itu agak subjektif. Seperti yang dicatat William, untuk kunci integer Anda bisa menggunakan array. Kebanyakan mesin JS dapat menggunakan array renggang di belakang layar.
Matthew Flaschen
8
Bahkan dalam sebuah array, semua nama properti diubah menjadi string.
Tim Down
2
@ Roamer-1888: Tidak, tidak. Satu-satunya perbedaan adalah bahwa menetapkan properti numerik ke array memengaruhi lengthproperti array .
Tim Down
2
@TimDown, dan apa yang saya katakan adalah Anda salah. "Menyetel properti numerik pada Array dapat memengaruhi properti panjang" adalah pernyataan yang salah. Properti Javascript Array benar-benar independen dari elemen Array. Apa yang membingungkan orang adalah bahwa sintaks asosiatif, misalnya myArray["1"] = foo, tampaknya menyetel properti, padahal sebenarnya menyetel elemen array, tetapi hanya karena "1" adalah representasi string dari bilangan bulat, yang merupakan omong kosong linguistik lengkap - tapi itu Javascript.
Roamer-1888
4
@ Roamer-1888: "Properti Javascript Array benar-benar independen dari elemen Array" adalah pernyataan yang salah. myArray["1"] = footidak hanya tampak seperti menyetel properti, itu sebenarnya menyetel properti (dengan kunci "1") dalam setiap arti dari definisi properti. Misalnya, myArray.hasOwnProperty("1")hasil true. Secara semantik, properti ini juga dapat dianggap sebagai "elemen" karena memiliki kunci numerik, tetapi tidak ada lagi yang membedakan "elemen" array dari properti array. Baca spesifikasinya. Jika Anda masih tidak setuju, kutip sumber Anda.
Hans
27

Dalam suatu objek, tidak, tetapi saya telah menemukan Peta sangat berguna untuk aplikasi ini. Di sinilah saya telah menggunakannya untuk kunci numerik, acara berbasis kunci.

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)();
  }
}
corvid
sumber
1
101 entri Ludumdare yang elegan ! +1
kaiser
11

Muncul dengan desain di ECMA-262-5:

Jenis Pengenal Properti digunakan untuk mengaitkan nama properti dengan Penjelas Properti. Nilai dari tipe Pengenal Properti adalah pasangan formulir (nama, keterangan), di mana nama adalah String dan keterangan adalah nilai Penjelas Properti.

Namun, saya tidak melihat spesifikasi pasti untuk itu di ECMA-262-3. Terlepas dari itu, saya tidak akan mencoba menggunakan non-string sebagai nama properti.

Rob Olmos
sumber
2

Apakah kita membutuhkan sesuatu seperti ini?

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

Konsol: Objek

1: "nilai"

Chittrang Mishra
sumber
0

Saya pikir Anda dapat melakukan hal berikut jika Anda ingin menggunakan hal di atas untuk mengaksesnya seperti nomor, saya melakukan hal yang sama dan berhasil.

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

Ini hanya berfungsi jika kunci tidak dimulai dengan dan karakter numerik jika tidak maka akan diubah menjadi angka. Lihat contoh berikut:

parseInt("45kjghk") === 45

Saya menggunakan jQuery di sini


Diperbarui:

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
}

Ini dapat mengatasi masalah di atas. Tolong sarankan lebih baik jika tersedia dan masalah dengan jawaban ini jika ada.

Shivam Sharma
sumber
-3

Dalam JavaScript, string numerik dan angka dapat dipertukarkan, jadi

myObject[1] == myObject['1']

Jika Anda benar-benar ingin angka menjadi kunci untuk suatu objek, Anda mungkin menginginkan sebuah array (yaitu dibuat dengan new Array()atau []).

William Niu
sumber
2
Terima kasih atas tanggapannya, tetapi ini tidak sepenuhnya akurat. Sebuah numerik hanya akan kembali sebagai 'number' dari sebuah typeof, dan sebaliknya dengan string.
Spot
@william 'string numerik dan angka yang dapat dipertukarkan' tidak benar. Bilangan adalah Bilangan dan String adalah String. Lihat Object.prototype.toString.call(someObject)Masalahnya adalah Anda tidak dapat menggunakan Angka sebagai kunci.
mikemaccana