【问题标题】:Cannot read property 'push' of undefined when combining arrays组合数组时无法读取未定义的属性“推送”
【发布时间】:2014-09-10 13:32:15
【问题描述】:

当将数组的内容推送到另一个数组时,我得到了

“Uncaught TypeError: Cannot read property 'push' of undefined”错误 在这个sn-p中。

var order = new Object(), stack = [];
for(var i=0;i<a.length;i++){
    if(parseInt(a[i].daysleft) == 0){ order[0].push(a[i]); }
    if(parseInt(a[i].daysleft) > 0){ order[1].push(a[i]); }
    if(parseInt(a[i].daysleft) < 0){ order[2].push(a[i]); }
}

为什么在第二个 if 语句中会出现此错误? 非常感谢!

【问题讨论】:

    标签: javascript jquery web console


    【解决方案1】:

    您收到错误是因为 order[1]undefined

    该错误消息意味着在您的代码中的某处,正在尝试访问具有某个名称的属性(这里是“push”),但引用的基础实际上是undefined,而不是对象。因此,要找到问题所在,您需要查找引用该属性名称(“push”)的代码,并查看其左侧的内容。在这种情况下,代码是

    if(parseInt(a[i].daysleft) > 0){ order[1].push(a[i]); }
    

    这意味着代码期望order[1] 是一个数组。然而,它不是一个数组;它是undefined,所以你得到了错误。为什么是undefined?好吧,根据您的问题,您的代码不会做任何其他事情。

    现在,如果您只想将a[i] 放在对象的特定属性中,则根本不需要调用.push()

    var order = [], stack = [];
    for(var i=0;i<a.length;i++){
        if(parseInt(a[i].daysleft) == 0){ order[0] = a[i]; }
        if(parseInt(a[i].daysleft) > 0){ order[1] = a[i]; }
        if(parseInt(a[i].daysleft) < 0){ order[2] = a[i]; }
    }
    

    【讨论】:

    • 如果它被定义为一个对象..我不应该在那里使用任何数字吗?
    • @d3nm4k 没有。您必须初始化 order[0]order[1]order[2] 才能获得一些值(我猜是一个数组)。那不会为你做的;为什么会这样?
    • 哦,明白了!我会花更多的时间来获得 order[1] = [];出去。谢谢!
    • 谢谢!!!根本不需要 .push(),只需分配即可。
    【解决方案2】:

    当您没有将数组初始化为空白时,会在角度出现此错误。
    举个例子:

    userlist: any[ ];
    this.userlist = [ ]; 
    

    userlist: any = [ ];
    

    【讨论】:

    • 如果你想要一个安全类型的数组,那么public _userList: User[] = []
    【解决方案3】:

    orderObject,而不是 Array()

    push() 用于数组。

    参考to this post

    试试这个(但你的子对象必须是Arrays()):

    var order = new Array();
    
    // initialize order; n = index
    order[n] = new Array();
    
    // and then you can perform push()
    order[n].push(some_value);
    

    或者您可以将 order 用作非数组对象的数组:

    var order = new Array();
    
    order.push(a[n]);
    

    【讨论】:

    • 即使我将它定义为一个数组,它仍然给我同样的错误。
    • @d3nm4k 您只想将a[i] 的值放在位置0、1 或2 中吗?如果是这样,您不要为此使用.push().push() 方法用于将值添加到数组的 end
    【解决方案4】:

    在大多数情况下你必须初始化数组,

    let list: number[] = [];
    

    【讨论】:

      【解决方案5】:

      您无需提供索引。

      不要使用order[0].push(a[i]),而是使用order.push(a[i])

      【讨论】:

        【解决方案6】:

        我用打字稿按以下方式修复

        1. 定义和初始化firest

        pageNumbers: number[] = [];

        1. 比填充它

          for (let i = 1; i < 201; i++) {
              this.pageNumbers.push(i);
          }
          

        【讨论】:

          【解决方案7】:

          一般来说,Push 方法用于在数组末尾添加元素。

          在这里,您使用了对象的 push 方法,而不是“顺序”的数组。

          调试步骤...

          将对象变成空数组,

          var order = [], stack = [];
          

          现在你可以像往常一样使用这个数组的 push 方法了。

          对这个'order'数组使用push方法;向数组调用 push 方法时,不应使用数组索引。只需使用数组的名称即可。

          var order = [], stack = [];
          
          for(var i = 0; i<a.length; i++){
          
             if(parseInt(a[i].daysleft) == 0){ 
               order.push(a[i]); 
             }
          
             if(parseInt(a[i].daysleft) > 0){ 
               order.push(a[i]); 
             }
          
             if(parseInt(a[i].daysleft) < 0){ 
               order.push(a[i]); 
             }
          }
          

          【讨论】:

            【解决方案8】:

            您的问题的答案是简单的订单不是一个对象,而是一个数组。 var order = new Array(); order.push(/要推送的项目/); 每当出现此错误时,只需检查错误在哪个属性的左侧,在这种情况下,它是 push,它是 order[],所以它是未定义的。

            【讨论】:

              【解决方案9】:

              order[] 未定义,这就是原因

              只需将 order[1]...[n] 定义为 = 某个值

              这应该可以解决它

              【讨论】:

                猜你喜欢
                • 2017-10-16
                • 2015-10-09
                • 2021-06-20
                • 2020-10-10
                • 2021-03-06
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多