1
var sorted = DocumentListData.Documents.sort(function (a, b) {
    var nameA = a.Document.toLowerCase(),
        nameB = b.Document.toLowerCase();

    return nameA.localeCompare(nameB);
});

for (var i = 0, len = sorted.length; i < len; i++) {

    if (sorted[i].Document=== 'abc') {
        sorted.splice(i, 1);
    }

    if (sorted[i].Document=== 'xyz') {
        sorted.splice(i, 1);
    }
}

ここで何が間違いなのか、1時間頭を悩ませています。Document プロパティは存在しますが、Document is undefined と表示されます。

Uncaught TypeError: Cannot read property 'Document' of undefined. を削除するsorted.splice(i,1)と、動作し、エラーはありません。

4

2 に答える 2

4

繰り返し処理している配列を変更しています。 splice(i,1)i 番目の要素を削除します。並べ替えられた配列をスプライスすると、要素が削除されるため、ループが配列の元の長さに達するため、最終的には配列の長さを超えてしまいます。 sorted[i]その後、未定義になり、説明しているエラーが発生します。

一般に、現在その方法で繰り返し処理している配列を変更することは決して良い考えではありません。そのようにしなければならない場合は、 if チェックを含めて、それが配列の現在の長さでiないことを確認してください。>=ただし、ここでは while ループを使用する方がおそらく適しています。

var counter =0;
while(counter < sorted.length) {
var doc = sorted[counter].Document;
  if (doc === 'abc' ||doc === 'xyz') {
    sorted.splice(counter, 1);
  }
  else{
   counter++;
  }
}

さらにいくつかの考え

  1. documentは、javascript のブラウザー環境で定義済みの変数であり、一般に JS には、大文字の変数はコンストラクター関数専用であるという規則があります。そのDocumentため、プロパティ名の選択としてはおそらく適切ではありません。

  2. 古いバージョンの IE をサポートする必要がない場合は、よりクリーンな方法としてArray.Prototype.filterを調べることもできます。

于 2013-03-07T16:46:43.853 に答える
2

Document最後の要素のが、の場合、最初の条件abcで削除されます。if

sorted[i]undefined(最後の要素を削除したため)になり、2回目の実行時に、if説明しているエラーが発生します。

else if:を使用してこれを修正できます。

if (sorted[i].Document=== 'abc') {
    sorted.splice(i, 1);
} else if (sorted[i].Document=== 'xyz') {
    sorted.splice(i, 1);
}
于 2013-03-07T16:45:37.227 に答える