Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/438.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中定义函数时,是否有方法将数组作为参数传递?_Javascript_Arrays_Function_Arguments - Fatal编程技术网

在javascript中定义函数时,是否有方法将数组作为参数传递?

在javascript中定义函数时,是否有方法将数组作为参数传递?,javascript,arrays,function,arguments,Javascript,Arrays,Function,Arguments,当我运行代码时,我得到一个错误,说.push()不是一个函数,这是因为checkableArr不是一个数组,(我想)但checkableArr是arr的变体(调用函数时将传递的参数),函数无法知道arr将是一个数组,有没有办法解决这个问题?是的,我们使用call/apply方法将数组作为参数传递。在您的代码中,当您使用arr.pop()时,它会根据您指定的数组类型转换为数字/字符串,我在下面指定了整数值,因此checkableArr现在是整数,因此您会得到一个错误 更正的代码在这里。只需在代码中

当我运行代码时,我得到一个错误,说.push()不是一个函数,这是因为checkableArr不是一个数组,(我想)但checkableArr是arr的变体(调用函数时将传递的参数),函数无法知道arr将是一个数组,有没有办法解决这个问题?

是的,我们使用call/apply方法将数组作为参数传递。在您的代码中,当您使用
arr.pop()
时,它会根据您指定的数组类型转换为数字/字符串,我在下面指定了整数值,因此
checkableArr
现在是整数,因此您会得到一个错误

更正的代码在这里。只需在代码中替换,如:

const validateCred = arr => {
    let checkableArr = arr.pop();
    for (let i = arr.length - 1; i >= 0; i--) {
        arr[i]
        checkableArr.push(arr[i])
    }

}

您得到了这个错误,因为您没有确保传递的数组(
arr
)的最后一项是数组本身,但是函数的逻辑要求它是数组

有多种方法可以解决这个问题,其中一些已经被其他人(@hungerstar)概述过

检查
arr的最后一个元素

一种尝试是确保
arr
中的最后一个元素/项是一个数组,如果不是,则退出

let checkableArr = arr; //arr.pop();
尽管这并不能解决根本原因,但它可以确保您获得一个关于出错原因的体面且描述性的信息。如果最后一项本身不是数组,则可以通过定义一个回退数组来改进这一点。大概是这样的:

const validateCred = arr => {
  let lastItem = arr.pop();
  if (!Array.isArray(lastItem)) {
    throw new Error('validateCred :: Last item of passed array must be an array itself');
  }
  // ... rest of your code ...
}
需要注意的一点是:如果最后一项可能是一个包含值的数组,则必须将该值复制到新数组中

const validateCred = arr => {
  let lastItem = arr.pop();
  let checkableArr = Array.isArray(lastItem) ? lastItem : [];
  // ... rest of your code ...
}
要同时支持较旧的环境,您可以使用
.reduce
.concat
而不是
.flat

// impure version
const validateCred = arr => arr.reverse().flat();

// pure version
const validateCred = arr => arr.flat().reverse();

pop
返回最后一个元素,而不是数组。你想在函数中做什么?如果您试图反转数组,则
让checkableArr=[]
之外返回checkableArr
loop@hungerstar我很确定你的建议也会失败,因为
.pop
会改变数组,这意味着您的
checkableArr
将在最后一项(已删除)之前包含值:-)我确信您的意思是
let item=arr.pop();让checkableArr=Array.isArray(项)?项目:[]@David是的,谢谢你抓到了。在
arr
上调用
.pop()
两次,这样会两次删除最后一项并提供错误的值。
array.prototype.pop
不会将值转换为
String
Number
(或任何其他内容),它只返回数组中的最后一个元素。此外,您的“修复”将产生不同的结果:如果我们对给定代码给出
[1,2,[]]
,它将导致
[2,1]
。您的更改将使其产生
[1,2,[],[]2,1]
。如果这有助于解决问题,请联系我们。
// impure version
const validateCred = arr => arr.reverse().flat();

// pure version
const validateCred = arr => arr.flat().reverse();
// impure version
const validateCred = arr => arr.reverse().reduce((acc, x) => acc.concat(x), []);

// pure version
const validateCred = arr => arr.reduce((acc, x) => acc.concat(x), []).reverse();