首页 > 解决方案 > 在 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

如果最近添加的元素与右大括号相同,则我们有一个匹配的左/右大括号。增加索引并返回分析其余的大括号。

它看起来怎么样?

标签: javascriptarrays

解决方案


不要使用...,这会将数组内容传播到函数的单独参数中,就像您编写的那样:

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


推荐阅读