カスタムキーを持つ配列として扱うJavaScriptオブジェクトをループする必要があります。プロパティには本質的な順序がないため、これは完全にはサポートされていませんが、常にプロパティを並べ替えるので、このアプローチは単純で信頼できるものであることがわかりました。
この問題は、キーが数値、または数値としてキャストできる文字列の場合に発生します。
このコードを実行すると:
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);}
出力は次のとおりです。
4294966111
4294966222
4294966333
---
4294968222
4294968333
4294968111
つまり:
- (test1)キーが2 ^ 32(4,294,967,296)未満の場合、自動的に並べ替えられ、最小のものが最初に
- (test2)キーが2 ^ 32を超える場合、それらは並べ替えられません。
問題は、なぜこれが起こっているのかということです。
私がテストしたすべてのブラウザー(Google Chrome 79.0、Mozilla Firefox 71.0、Microsoft Edge 44.18362、Internet Explorer 11.535)はこの出力に同意しているため、いくつかの公式の仕様が必要です。
更新
それがしきい値の問題であることを知る前に、私は多くの数をテストしました。シーケンス2、3、1が同じ方法で順序付けられた3つのタイムスタンプとは異なる動作をすることは奇妙でした。
test1およびによって問題を直接確認できますtest2。「問題」は、仕様のV8実装のキーキャッシングにあると思います。
4294968333と4294968111が2 ** 32(つまり4294967296)より大きいためです。したがって、これらは配列インデックスではないため、昇順の数値順ではなく、プロパティの作成順で繰り返されます。これは、実際にフィドルで行っていることとまったく同じです。(私の回答を参照してください)
