首页 > 解决方案 > 在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 将是一个数组,有没有办法解决这个问题?

标签: javascriptarraysfunctionarguments

解决方案


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

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

检查最后一个元素arr

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

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只是反转和展平(并且您只针对支持环境),您可以使用单行轻松做到这一点:

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

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

为了也支持旧环境,您可以使用.reduceand.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();

推荐阅读