在 javascript 中定义函数时,有没有办法将数组作为参数传递?
Is there a way to pass an array as an argument when defining a function in javascript?
const validateCred = arr => {
let checkableArr = arr.pop();
for (let i = arr.length - 1; i >= 0; i--) {
arr[i]
checkableArr.push(arr[i])
}
}
当我 运行 代码时,我收到一条错误消息说 .push() 不是函数,这是因为 checkableArr 不是数组,(我认为)但 checkableArr 是arr(调用函数时将传递的参数)并且函数无法知道 arr 将成为一个数组,有什么办法可以解决这个问题吗?
是的,我们使用 call/apply 方法将数组作为参数传递。在您的代码中,当您使用 arr.pop()
时,它会根据您指定的数组类型转换为 number/string,我在下面指定了整数值,因此 checkableArr
现在是整数,因此您是出现错误。
更正后的代码在这里。只需将您的代码替换为:
let checkableArr = arr; //arr.pop();
你得到那个错误,因为你没有确定传递的数组 (arr
) 的 last 项本身是一个数组,但是你函数的逻辑要求它是一个数组。
有多种方法可以解决这个问题,其中一些已经被其他人 (@hungerstar) 概述过。
检查arr
的最后一个元素
一种尝试是确保 arr
中的最后一个 element/item 是一个数组,如果不是则退出。
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 ...
}
需要注意的一点:如果最后一项可能是一个数组,其中包含一个值,您必须将该值复制到新数组中!
const validateCred = arr => {
let lastItem = arr.pop();
let checkableArr = Array.isArray(lastItem) ? lastItem : [lastItem]; // <--
// ... rest of your code ...
}
提示:以下答案基于猜测。名称 validateCred
让我假设您使用它来验证凭据。然而,这只是猜测,因为所有提供的代码所做的就是获取最后一项,然后将 arr
的其余内容反向推入其中(=反转和展平)
反转平整
如果你想用 validateCred
做的只是反转和扁平化(并且你只针对支持环境),你可以使用 one-liner:
轻松做到这一点
// impure version
const validateCred = arr => arr.reverse().flat();
// pure version
const validateCred = arr => arr.flat().reverse();
为了也支持较旧的环境,您可以使用 .reduce
和 .concat
而不是 .flat
:
// 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();
const validateCred = arr => {
let checkableArr = arr.pop();
for (let i = arr.length - 1; i >= 0; i--) {
arr[i]
checkableArr.push(arr[i])
}
}
当我 运行 代码时,我收到一条错误消息说 .push() 不是函数,这是因为 checkableArr 不是数组,(我认为)但 checkableArr 是arr(调用函数时将传递的参数)并且函数无法知道 arr 将成为一个数组,有什么办法可以解决这个问题吗?
是的,我们使用 call/apply 方法将数组作为参数传递。在您的代码中,当您使用 arr.pop()
时,它会根据您指定的数组类型转换为 number/string,我在下面指定了整数值,因此 checkableArr
现在是整数,因此您是出现错误。
更正后的代码在这里。只需将您的代码替换为:
let checkableArr = arr; //arr.pop();
你得到那个错误,因为你没有确定传递的数组 (arr
) 的 last 项本身是一个数组,但是你函数的逻辑要求它是一个数组。
有多种方法可以解决这个问题,其中一些已经被其他人 (@hungerstar) 概述过。
检查arr
一种尝试是确保 arr
中的最后一个 element/item 是一个数组,如果不是则退出。
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 ...
}
需要注意的一点:如果最后一项可能是一个数组,其中包含一个值,您必须将该值复制到新数组中!
const validateCred = arr => {
let lastItem = arr.pop();
let checkableArr = Array.isArray(lastItem) ? lastItem : [lastItem]; // <--
// ... rest of your code ...
}
提示:以下答案基于猜测。名称 validateCred
让我假设您使用它来验证凭据。然而,这只是猜测,因为所有提供的代码所做的就是获取最后一项,然后将 arr
的其余内容反向推入其中(=反转和展平)
反转平整
如果你想用 validateCred
做的只是反转和扁平化(并且你只针对支持环境),你可以使用 one-liner:
// impure version
const validateCred = arr => arr.reverse().flat();
// pure version
const validateCred = arr => arr.flat().reverse();
为了也支持较旧的环境,您可以使用 .reduce
和 .concat
而不是 .flat
:
// 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();