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