【问题标题】:Error: columnListA[i] is undefined错误:columnListA[i] 未定义
【发布时间】:2014-05-12 12:12:03
【问题描述】:

当我尝试使用 columnListB 中存在的对象从 columnListA 中删除一些对象时,我得到Error: columnListA[i] is undefined

谁能告诉我一些解决方案。

我的json列表如下所示:

columnListA =[ {id:"a1", value:"XYZ"},{id:"a2", value:"ABC"},{id:"a3", value:"JHI"},{id:"a4", value:"PLM"}]

columnListB =[ {id:"a1", value:"XYZ"}]

我的代码是这样的

for ( var j = 0, selLength = columnListB.length; j < selLength; j++)
{
    for ( var i = 0, nonSelLength = columnListA.length; i < nonSelLength; i++)
    {
     if (columnListA[i].id=== columnListB[j].id)
     {
       columnListA.splice(i, 1);
     }
    }
}

【问题讨论】:

    标签: javascript json splice


    【解决方案1】:

    你得到这个是因为你在原地改变了columnListA。由于您删除了一个元素,它的长度从 4 变为 3,但您仍会迭代直到 i = 3。

    我建议创建一个新数组,而不是就地更改它并冒着发生此类错误的风险。示例:

    columnListA = columnListA.filter(function(nonSel) {
      return columnListB.some(function(sel) {
        return sel.id !== nonSel.id;
      });
    });
    

    Array#filter 接受一个函数,并返回一个新数组,该数组仅包含函数返回 true 的元素。

    Array#some 接受一个函数,如果该函数对数组中的所有元素返回 true,则返回 true,否则返回 false

    【讨论】:

    • 我不认为它更快,但我发现除非您谈论数十万个项目,否则差异极不可能是明显的。优化易读性和易维护性,在性能不够好时寻找性能
    【解决方案2】:

    试试:

    for ( var j = 0; j < columnListB.length; j++)
    {
        for ( var i = 0; i < columnListA.length; i++)
        {
            if (columnListA[i].id === columnListB[j].id)
            {
                columnListA.splice(i, 1);
            }
        }
    }
    

    JSFiddle

    从循环中删除 nonSelLength = columnListA.length; i &lt; nonSelLength; 并将变量定义为小于对象的长度

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-16
      • 2021-11-16
      • 1970-01-01
      • 2015-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多