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);
    }
}

关于这里的错误是什么,我只是想了一个小时。尽管 Document 属性存在,但它抛出我 Document 是未定义的。

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(因为你已经删除了最后一个元素),当第二次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 回答