为什么我会收到“.push不是一个函数”的错误?

9

我的代码出了什么问题?

function longestConsec(strarr, k) {
  var currentLongest = "";
  var counter = 0;
  var outPut = [];

  if(strarr.length === 0 || k > strarr.length || k <= 0){
    return "";
  }
  for(var i = 0; i < strarr.length; i++){
    if(strarr[i] > currentLongest){
      currentLongest = strarr[i];
    }
  }
  while(currentLongest !== strarr[counter]){
    counter = counter + 1
  }
  for (var j = 0; j < k; j ++){
    outPut = outPut.push(strarr[counter + j]);
  }

  outPut = outPut.join("");

   return outPut;
}

我一直收到“outPut.push不是一个函数”的错误。

10
array.push 返回推入元素后数组的长度。在第一次推入之后,outPut 变成了一个数字而不是数组 - 只需将 outPut = outPut.push(strarr[counter + j]); 改为 outPut.push(strarr[counter + j]); 即可。 - Jaromanda X
因为有人发布了一个“仅代码”的答案,他们删除了它而不是解释它,尽管他们可能想要解释一下,所以为什么不同时发布一个答案呢:p - Jaromanda X
1
@Vini - 不,一点也不。 - Jaromanda X
当你向数组中添加元素时,不需要重新分配输出。只需使用.push()即可。 - Nimeshka Srimal
3
为什么要用 "outPut" 这个名称?是因为 "output" 已经被保留了吗? - Peter Mortensen
显示剩余2条评论
3个回答

15
Array push函数将元素添加到数组末尾,并返回添加元素后的数组长度。 因此,在你的代码中,
outPut = outPut.push(strarr[counter + j]);

现在的 outPut 是一个数字,而不是一个数组,因此第二次循环后,outPut 不再具有 push 方法。

一个简单的解决方法是将该行代码更改为:

outPut.push(strarr[counter + j]);

4

Array.push

将一个或多个元素添加到数组的末尾,并返回新数组的长度。

你可以使用以下代码:

outPut = outPut.push(strarr[counter + j]);

您正在将元素添加到outPut.push(strarr[counter + j]);,然后重新分配outPush到数组的长度。

您应该只调用数组的push方法,这样就会添加一个新元素:

for (var j = 0; j < k; j ++){
    outPut.push(strarr[counter + j]);
}

1

Array.push() 返回该数组的长度。在您的代码中,您将一个数字赋值给outPut。现在当循环第二次运行时,outPut 不再是一个数组而是一个数字,因此您会收到错误。

您可以通过向控制台记录outPut 来检查它。你会发现

for (var j = 0; j < k; j ++){
    outPut = outPut.push(strarr[counter + j]);
    console.log(outPut);
}

它将显示:

 1
  VM696:18 Uncaught TypeError: outPut.push is not a function
    at longestConsec (<anonymous>:18:21)
    at <anonymous>:1:1

你需要做的就是将其更改为:

for (var j = 0; j < k; j ++){
    outPut.push(strarr[counter + j]);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接