Saya perlu mengulang melalui objek JavaScript memperlakukannya sebagai array dengan kunci kustom. Saya tahu ini tidak sepenuhnya didukung, karena properti tidak memiliki urutan instrinsik, tetapi karena saya selalu memesan ulang properti, saya menemukan pendekatan ini sederhana dan dapat diandalkan ... sampai sekarang.
Masalah terjadi ketika tombol adalah angka, atau string yang dapat dicor sebagai angka.
Ketika saya menjalankan kode ini:
var test1 = {4294966222:"A",4294966333:"A",4294966111:"A"};
var test2 = {4294968222:"A",4294968333:"A",4294968111:"A"};
for (var k in test1) {console.log(k);}
console.log("---");
for (var k in test2) {console.log(k);}
outputnya adalah:
4294966111
4294966222
4294966333
---
4294968222
4294968333
4294968111
Yang berarti:
- (test1) jika kunci di bawah 2 ^ 32 (4.294.967.296), mereka secara otomatis disusun ulang, yang terkecil terlebih dahulu
- (test2) jika kunci di atas 2 ^ 32, mereka TIDAK disusun ulang.
Pertanyaannya adalah: mengapa ini terjadi?
Karena semua browser yang saya uji (Google Chrome 79.0, Mozilla Firefox 71.0, Microsoft Edge 44.18362, Internet Explorer 11.535) setuju dengan output ini, harus ada beberapa spesifikasi resmi.
Memperbarui
Saya menguji banyak angka sebelum menemukan itu adalah masalah ambang batas. Saya menemukan aneh bahwa urutan 2,3,1 berperilaku berbeda dari tiga cap waktu yang dipesan dengan cara yang sama.
test1dan test2. Saya pikir "masalah" adalah dari caching kunci dalam implementasi V8 dari spec.
4294968333dan 4294968111lebih besar dari 2 ** 32(yang 4294967296). Jadi, mereka bukan indeks array, jadi mereka diiterasi dalam urutan pembuatan properti, bukan dalam urutan numerik naik - yang persis apa yang mereka lakukan di biola, seperti yang diharapkan. (lihat jawaban saya)
