3

Jscript にスパース配列があり、null 以外の要素が負のインデックスと正のインデックスの両方で発生しています。for in ループを使用しようとすると、最小 (負) のインデックスから最大の正のインデックスまで配列をトラバースしません。代わりに、要素を追加した順序で配列を返します。列挙も機能しません。それを可能にする方法はありますか?

arrName = new Array();
arrName[-10] = "A";
arrName[20] = "B";
arrName[10] = "C";

ループすると、A、C、B の順に表示されるはずです。

4

2 に答える 2

9

技術的には、負のインデックスを持つことはできないため、「A」は配列にまったくありません。これは単に arrName オブジェクトのメンバーです。arrName.length を確認すると、それが 21 (0,1,2,...,20) であることがわかります。代わりにプレーン オブジェクトを (ハッシュ テーブルとして) 使用しないでください。このようなものが動作するはずです:

<script type="text/javascript">
//define and initialize your object/hastable
var obj = {};
obj[20] = 'C';
obj[10] = 'B';
obj[-10] = 'A';

// get the indexes and sort them
var indexes = [];
for(var i in obj){
    indexes.push(i);
}
indexes.sort(function(a,b){
    return a-b;
});

// write the values to the page in index order (increasing)
for(var i=0,l=indexes.length; i<l; i++){
    document.write(obj[indexes[i]] + ' ');
}
// Should print out as "A B C" to the page
</script>
于 2008-09-27T18:18:35.947 に答える
4

JavascriptArrayの s とs の境界にぶつかっています。Object配列要素は、0 から 4294967294 (最大符号なし 32 ビット整数 - 1) までの整数である序数によってアクセスされます。オブジェクトのプロパティには名前でアクセスします。-10 は有効な序数ではないため、名前として解釈されます。より簡単な例を次に示します。

var arr = new Array();
arr[0] = 'A';
arr[1] = 'B';
arr[-1] = 'C';
arr.length

結果は 2 です。配列にはインデックス 0 と 1 の 2 つの要素しかありません。

于 2008-09-27T18:23:34.250 に答える