javascript - 在 JavaScript 中的函数之间传递数组
问题描述
我无法理解如何在函数之间遍历,在它们之间传递数组,一整天的“未定义”或“这不是一个函数”让我大吃一惊。
我目前正在对 codewars 进行挑战,任务看似简单,取一个带有开括号和闭括号的字符串,并检查它们是否以正确的顺序打开/关闭。然而,由于某种原因,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()
,需要返回其值;请参阅递归函数不返回指定值。
check()
而且您从不使用in的返回值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
推荐阅读
- node.js - Fastify 本地时间的 prettyPrint 登录?
- explorer - 在 Windows 10 中以管理员用户身份运行 explorer.exe
- discord.py - 如何获取在 discord.py rewrite 中做出反应的所有用户的列表
- javascript - State Redux 没有映射到 props
- java - 在 Javafx 中对齐两个滚动网格窗格
- javascript - 正则表达式用于逗号与换行符之间的对 Javascript
- python - 为什么 python 会混淆我的模块包
- google-apps-script - 如何将附加到工作表的 Google 应用脚本有选择地分发给不属于同一 G Suite 域的人员
- java - 使用 JUnit/Mockito 模拟保存方法
- sql-server - 在 VS Code 中构建 SQL Server 项目