簡體   English   中英

在 JavaScript 中的函數之間傳遞數組

[英]Passing arrays between functions in JavaScript

我無法理解如何在函數之間遍歷,在它們之間傳遞數組,一整天的“未定義”或“這不是函數”讓我感到很困惑。

我目前正在做一個關於代碼戰的挑戰,任務看起來很簡單,取一個帶有開括號和閉括號的字符串,然后檢查它們是否以正確的順序打開/關閉。 但是,由於某種原因, console.log在這個挑戰中沒有返回任何東西,所以我不得不盲目地去做。

這是第一個函數,我設置了所有變量和數組並將其傳遞給下一個函數。

function validBraces(braces) {
   var braceAr = [];
   braceAr = braces.split('');
   var testAr = []; // array to be used for testing the order
   var i = 0; // iterator for the loop in analyse() function
   analyse(...braceAr,...testAr,i); //send the arrays to the function!
}

在上面函數的最后一行中,我試圖將數組傳遞給下一個函數,我不想在下一個函數中創建它們,因為有第三個函數進行檢查,並將其再次發送回第二個(分析)。 我在這個“版本”中使用了擴展運算符,但是,我已經用盡了我的理解和資源,所以我伸出手來獲得更好的理解。 有人可以解釋我如何將這些數組傳遞給函數。 我試圖從我發現的解釋中應用一些東西,但我覺得我可能會遺漏一些限制我的基本知識。

其余代碼在下面,它可能不相關,但以防萬一。 我很想解決這個問題,所以盡量不要放棄太多;)

function analyse(braceAr,testAr,i) {

   for(l = braceAr.length; i<l ;) {
     switch(braceAr[i]) {

       case '[':
           testAr.push("]");
           break;
       case '{':
           testAr.push("}");
           break;
       case '(':
           testAr.push(")");
           break;
       case ']':
           check(...braceAr,...testAr,i);
           break;
       case '}':
           check(...braceAr,...testAr,i);
           break;
       case ')':
           check(...braceAr,...testAr,i);
           break;

      } //close switch
    } //close loop


return (testAr.length = 0 ? true : false);

  } //close function 

如您所見,我打算在數組中的每個元素之間切換,如果是左大括號,我會將相應的右大括號推入數組中,以便在第三個函數check()進行比較

function check(braceAr,testAr,i) {   

    if(testAr.pop() === braceAr[i])
      {
        i++;
        analyse(...braceAr,...testAr,i);

      } else { return false; }

} //close function

如果最近添加的元素與右大括號相同,則我們有一個匹配的左/右大括號。 增加索引並返回分析其余的大括號。

它看起來如何?

不要使用... ,這會將數組內容傳播到函數的單獨參數中,就像你寫的一樣:

analyse(braceAr[0], braceAr[1], braceArr[2], /* rest of braceAr */,
        testAr[0], testAr[1], testAr[2], /* rest of testAr */, i);

寫就好了:

analyse(braceAr,testAr,i);

調用check()時遇到同樣的問題。

check()遞歸調用analyse() ,需要返回它的值; 請參閱遞歸函數不返回指定值

而且你從來沒有在analyse()使用check()的返回值,所以我完全不確定它的意義是什么。 我不確定它要做什么以及應該如何使用返回值。

 validBraces("a[foo(bar).baz]"); function validBraces(braces) { var braceAr = []; braceAr = braces.split(''); var testAr = []; // array to be used for testing the order var i = 0; // iterator for the loop in analyse() function analyse(braceAr, testAr, i); //send the arrays to the function! console.log(testAr); } function check(braceAr, testAr, i) { if (testAr.pop() === braceAr[i]) { i++; return analyse(braceAr, testAr, i); } else { return false; } } //close function function analyse(braceAr, testAr, i) { for (l = braceAr.length; i < l; i++) { switch (braceAr[i]) { case '[': testAr.push("]"); break; case '{': testAr.push("}"); break; case '(': testAr.push(")"); break; case ']': check(braceAr, testAr, i); break; case '}': check(braceAr, testAr, i); break; case ')': check(braceAr, testAr, i); break; } //close switch } //close loop return (testAr.length = 0 ? true : false); } //close function

analyse(...braceAr,...testAr,i)不會將數組braceArtestArfunction analyse(braceAr,testAr,i) { ,而是使用它們的內容作為函數的參數:

 var arrA = [1,2] var arrB = [3,4] function test(a, b, c, d) { console.log(a, ',', b, ',', c, ',', d) } test(...arrA, ...arrB)

如果你想傳遞數組,你必須刪除傳播運算符...並只寫analyse(braceAr, testAr,i)

使用擴展運算符 ( ... ) 將每個數組元素作為參數傳遞。 這樣,當您嘗試使用push()函數時,它會生成錯誤。

 function faultyPasser(string) { var charArr = string.split(''); logChars(...charArr); } function logChars(charArr) { for (i in charArr) console.log(charArr[i]); } faultyPasser("Bad code.");

用數組重寫所有函數調用以擺脫擴展運算符。 只要沒有其他錯誤,它應該可以工作。

暫無
暫無

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

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