在JavaScript中的函数之间传递数组

时间:2018-08-17 18:19:39

标签: javascript arrays

我无法理解如何在函数之间遍历,在函数之间传递数组,整整一天的“未定义”或“这不是函数”使我无法抽身。

我目前正在对代码战进行挑战,该任务看似很简单,请使用带有开括号和闭括号的字符串,并检查它们是否以正确的顺序打开/关闭。但是,由于某种原因,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

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

看起来如何?

3 个答案:

答案 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)不会将数组braceArtestAr传递给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.");

使用数组重写所有函数调用,以消除散布运算符。只要没有其他错误,它就应该起作用。