[英]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)
不會將數組braceAr
和testAr
給function 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.