Javascript 从数组中删除项会导致未捕获的TypeError

Javascript 从数组中删除项会导致未捕获的TypeError,javascript,json,Javascript,Json,我制作了一些jQuery插件——所有插件都解析JSON提要并使用Mustache.js呈现它们;每个插件接受一个显示多少项的整数值 我在尝试用以下代码解析堆栈溢出JSON提要时收到一个未捕获类型错误:无法读取未定义的属性“link”: $.ajax({ type: 'GET', url: query, contentType: "jsonp", dataType: 'jsonp', success: function (jsonp

我制作了一些jQuery插件——所有插件都解析JSON提要并使用Mustache.js呈现它们;每个插件接受一个显示多少项的整数值

我在尝试用以下代码解析堆栈溢出JSON提要时收到一个
未捕获类型错误:无法读取未定义的属性“link”:

   $.ajax({
      type: 'GET',
      url: query,
      contentType: "jsonp",
      dataType: 'jsonp',
      success: function (jsonp) {

        /* loop through JSON items converting the time from UNIX timestamp
         ** format to readable words by parsing it through timeConverter() */
        var i;
        for (i = 0; i < jsonp.items.length; i++) {
          if (i > num-1){
            delete jsonp.items[i];
          } else {
            jsonp.items[i].creation_date = timeConverter(jsonp.items[i].creation_date);
          }
        }


        var output = Mustache.render(must_template, jsonp);
        element.html(output);
        return element;
      } //EOF CALLBACK
    }); //EOF AJAX
$.ajax({
键入:“GET”,
url:query,
contentType:“jsonp”,
数据类型:“jsonp”,
成功:函数(jsonp){
/*循环通过JSON项从UNIX时间戳转换时间
**通过timeConverter()解析,将其格式化为可读字*/
var i;
对于(i=0;inum-1){
删除jsonp.items[i];
}否则{
jsonp.items[i].creation\u date=timeConverter(jsonp.items[i].creation\u date);
}
}
var output=Mustache.render(必须使用模板,jsonp);
html(输出);
返回元素;
}//EOF回调
}); //EOF AJAX
作为一个快速修复,我通过简单地注释掉
delete
操作来禁用截断。该错误表明Mustache.js正在尝试访问不再存在的JSON对象的一部分;然而,
delete
操作显然只影响超过用户定义限制的项目

发生此行为时,阵列中仍有20项。

注意:
是的,我自己回答了这个问题;然而,如果另一个答案显示出最佳实践、更简洁的方式或在某种程度上改进了我的答案,我更愿意接受它。:)

在谷歌搜索了很多次之后,我什么也找不到,甚至StackOverflow也让我失望了。然后,偶然地,我遇到了我对删除行进行注释的“快速破解”的意外副作用

由于我没有注释掉整个
if/else
块,我的
timeConverter()
函数没有在通常会被删除的项目上运行。这证实了
for()
if(){}/else{}
的组合工作正常。所以看起来好像Mustache.js试图访问已经删除的项目!几乎就好像删除项目时,
items[]
数组的
length
属性没有更新一样

我做了一个测试用例,这证实了这就是问题所在。以下是代码和输出:

    $.ajax({
      type: 'GET',
      url: query,
      contentType: "jsonp",
      dataType: 'jsonp',
      success: function (jsonp) {

        /* loop through JSON items converting the time from UNIX timestamp
         ** format to readable words by parsing it through timeConverter() */
        var i;
        for (i = 0; i < jsonp.items.length; i++) {
          if (i > num-1){
              console.log("Deleting item. Current Count: "+jsonp.items.length);
            delete jsonp.items[i];
              console.log("Deleting item. New Count: "+jsonp.items.length);
          } else {
            jsonp.items[i].creation_date = timeConverter(jsonp.items[i].creation_date);
          }
        }
        console.log(jsonp);
        return element;
      } //EOF CALLBACK
    }); //EOF AJAX
以下是生成的输出:

然后,当将该代码放回测试环境并与Mustache.js一起使用时,该代码运行良好在数组上使用delete关键字不会影响length属性


来自Java背景的我认为
length
是一个属性,而不是一个函数这一事实是理所当然的,因此它不会在对数组进行任何更改时进行快速更新。一个愚蠢的错误花费了我太多的时间!然而,我找不到任何其他关于这个的帖子,所以我想我会把它贴上去,希望它能帮助其他类似职位的人

在谷歌搜索了很多次之后,我什么也找不到,甚至StackOverflow也让我失望了。然后,偶然地,我遇到了我对删除行进行注释的“快速破解”的意外副作用

由于我没有注释掉整个
if/else
块,我的
timeConverter()
函数没有在通常会被删除的项目上运行。这证实了
for()
if(){}/else{}
的组合工作正常。所以看起来好像Mustache.js试图访问已经删除的项目!几乎就好像删除项目时,
items[]
数组的
length
属性没有更新一样

我做了一个测试用例,这证实了这就是问题所在。以下是代码和输出:

    $.ajax({
      type: 'GET',
      url: query,
      contentType: "jsonp",
      dataType: 'jsonp',
      success: function (jsonp) {

        /* loop through JSON items converting the time from UNIX timestamp
         ** format to readable words by parsing it through timeConverter() */
        var i;
        for (i = 0; i < jsonp.items.length; i++) {
          if (i > num-1){
              console.log("Deleting item. Current Count: "+jsonp.items.length);
            delete jsonp.items[i];
              console.log("Deleting item. New Count: "+jsonp.items.length);
          } else {
            jsonp.items[i].creation_date = timeConverter(jsonp.items[i].creation_date);
          }
        }
        console.log(jsonp);
        return element;
      } //EOF CALLBACK
    }); //EOF AJAX
以下是生成的输出:

然后,当将该代码放回测试环境并与Mustache.js一起使用时,该代码运行良好在数组上使用delete关键字不会影响length属性

来自Java背景的我认为
length
是一个属性,而不是一个函数这一事实是理所当然的,因此它不会在对数组进行任何更改时进行快速更新。一个愚蠢的错误花费了我太多的时间!然而,我找不到任何其他关于这个的帖子,所以我想我会把它贴上去,希望它能帮助其他类似职位的人

与数组相比,
delete
是一个“低级”操作符。它直接删除对象属性,绕过所有特定的数组逻辑,因此不更新数组的长度

如果要从数组中删除元素,请使用,或者在您的情况下,您可以简单地设置数组的长度,然后迭代其余元素:

jsonp.items.length=Math.min(num,jsonp.items.length);
对于(i=0;i
delete
与数组相比是一个“低级”操作符。它直接删除对象属性,绕过所有特定的数组逻辑,因此不更新数组的长度

如果要从数组中删除元素,请使用,或者在您的情况下,您可以简单地设置数组的长度,然后迭代其余元素:

jsonp.items.length=Math.min(num,jsonp.items.length);
对于(i=0;i
Delete并没有改变数组计数,正如您已经发现的,它只是在删除密钥。要从数组中删除项,请执行以下操作:
jsonp.items.length = Math.min(num, jsonp.items.length);
for (i = 0; i < jsonp.items.length; i++) {
  jsonp.items[i].creation_date = timeConverter(jsonp.items[i].creation_date);
}
var array2 = [ 1, 2, 3, 4 ];
array2.splice(2, 1);

console.log('---------------------------');
console.log(array2.length); // 3
console.log(array2[0]); // 1
console.log(array2[1]); // 2
console.log(array2[2]); // 4
console.log(array2[3]); // undefined