9

コンテンツがインデックス順に挿入されるとは限らないが、インデックス順に反復処理する必要があるスパース配列があります。スパース配列を反復処理するには、for..in ステートメントを使用する必要があることを理解しています。

ただし、この記事によると:

for...in が特定の順序でインデックスを返すという保証はありません

しかし、このようなスタックオーバーフローの質問は、オブジェクト プロパティの順序は保証されていませんが、配列の順序は次のとおりであることを示唆しています。

オブジェクト内のプロパティの順序は JavaScript では保証されないため、配列を使用する必要があります。

Chrome、Firefox、IE の最新バージョンでこれをテストしました。

<ol id="items"></ol>
var list = [];

function addItem(index) {
    list[index] = { idx : index };
}

var insertOrder = [ 8, 1, 9, 2, 10, 3, 11, 4, 12, 5, 13, 6, 14, 7, 15 ];

for ( var i = 0; i < 15; i++ ) {
    addItem(insertOrder[i]);
}

for(var item in list) {
    $("#items").append("<li>" + list[item].idx + "</li>");
}

すべてがインデックスの順序を尊重しているように見えるので、これが常に当てはまると信頼できますか? それ以外の場合、どのようにインデックス順に取得するのが最善ですか?

4

2 に答える 2

12

MDNには、元の質問に対する回答があります。

注: for..in は、インデックスの順序が重要な配列を反復処理するために使用しないでください。

配列インデックスは、整数名を持つ列挙可能なプロパティであり、それ以外は一般的なオブジェクト プロパティと同じです。for...in が特定の順序でインデックスを返し、整数以外の名前を持つものや継承されたものを含むすべての列挙可能なプロパティを返すという保証はありません。

for..in疎な配列を繰り返し処理するために を使用する必要はありません。可能であれば、そうすることは絶対に避けてください。

あなたはただ使うことができます.forEach

list.forEach(function (el) {  // add a second parameter if you need the indices
    $("#items").append($("<li>").text(el.idx));
});

forEach インデックス順に反復し、配列に存在する要素のみを含めるように定義されています。

forEach配列内に存在する要素ごとに、提供されたコールバックを昇順で 1 回実行します。削除または削除されたインデックスに対しては呼び出されません。ただし、存在し、値が定義されていない要素に対しては実行されます。


をサポートしていない環境をターゲットにしている場合はforEach、以下を使用するか、その MDN ページで提供されている shim を使用できます。

for (var i = 0; i < list.length; i += 1) {
    if (i in list) {
        $("#items").append($("<li>").text(list[i].idx));
    }
}
于 2014-12-22T07:36:37.087 に答える