簡體   English   中英

在 javascript 中定義 function 時,有沒有辦法將數組作為參數傳遞?

[英]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])
    }

}

當我運行代碼時,我收到一條錯誤消息,說 that.push() 不是 function,這是因為 checkableArr 不是數組,(我認為)但 checkableArr 是 arr 的變體(當function 被調用)並且 function 無法知道 arr 將成為一個數組,有什么辦法可以解決這個問題嗎?

您收到該錯誤,因為您沒有確保傳遞的數組 ( 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內容的 rest 反向推入其中(= 反轉和展平)

反轉和展平

如果您想要對validateCred做的只是反轉和展平(並且您只針對支持環境),您可以使用單行輕松做到這一點:

// 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();

是的,我們使用 call/apply 方法將數組作為參數傳遞。 在您的代碼中,當您使用arr.pop()時,它會根據您指定的數組類型轉換為數字/字符串,我在 integer 值下方指定,所以checkableArr現在是 integer ,因此您會收到錯誤消息。

更正的代碼在這里。 只需在您的代碼中替換,例如:

let checkableArr = arr; //arr.pop();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM