我无法理解如何在函数之间遍历,在函数之间传递数组,整整一天的“未定义”或“这不是函数”使我无法抽身。
我目前正在对代码战进行挑战,该任务看似很简单,请使用带有开括号和闭括号的字符串,并检查它们是否以正确的顺序打开/关闭。但是,由于某种原因,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()
中进行比较< / p>
function check(braceAr,testAr,i) {
if(testAr.pop() === braceAr[i])
{
i++;
analyse(...braceAr,...testAr,i);
} else { return false; }
} //close function
如果最近添加的元素与右括号相同,则我们有一个匹配的右括号。递增索引,然后返回到分析其余大括号。
看起来如何?
答案 0 :(得分:1)
不要使用...
,那样会将数组内容散布到函数的单独参数中,就像您编写的一样:
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()
时,它需要返回其值;参见Recursive function does not return specified value。
而且您永远不会在check()
中使用analyse()
的返回值,因此我不确定它的意义是什么。我不确定它要做什么以及应如何使用返回值。
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
答案 1 :(得分:0)
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)
。
答案 2 :(得分:0)
使用扩展运算符(...
)将每个数组元素作为参数传递。这样,当您尝试使用push()
函数时,它将生成错误。
function faultyPasser(string) {
var charArr = string.split('');
logChars(...charArr);
}
function logChars(charArr) {
for (i in charArr)
console.log(charArr[i]);
}
faultyPasser("Bad code.");
使用数组重写所有函数调用,以消除散布运算符。只要没有其他错误,它就应该起作用。