【问题标题】:Passing arrays between functions in JavaScript在 JavaScript 中的函数之间传递数组
【发布时间】:2018-08-17 18:19:38
【问题描述】:

我无法理解如何在函数之间遍历,在它们之间传递数组,一整天的“未定义”或“这不是函数”让我大吃一惊。

我目前正在对 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

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

它看起来怎么样?

【问题讨论】:

  • 这可能对你有用,假设它与你的 JS 函数调用的顺序很接近 - stackoverflow.com/questions/7609276/…
  • IIRC,正确排序函数只是一个好习惯,因为 lint 会引发错误。我一直在玩订单无济于事。我会整理一下,谢谢
  • braceArtestAr 已经是数组。将... 作为参数传递时,无需使用扩展运算符。
  • @JayJenkins 我的评论是在黑暗中拍摄的,无论如何我都不是 JS 专家。看起来一些合适的专家已经加入了;)

标签: javascript arrays


【解决方案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

而且你永远不会在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 中有一个无限循环,因为你永远不会增加i。您也永远不会使用check() 的返回值,当它调用analyse() 时它不会返回该值。
【解决方案2】:

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)

【讨论】:

    【解决方案3】:

    使用扩展运算符 (...) 将每个数组元素作为参数传递。这样,当您尝试使用 push() 函数时,它会产生错误。

    function faultyPasser(string) {
      var charArr = string.split('');
      logChars(...charArr);
    }
    
    function logChars(charArr) {
      for (i in charArr)
        console.log(charArr[i]);
    }
    
    faultyPasser("Bad code.");

    用数组重写所有函数调用,以摆脱扩展运算符。只要没有其他错误,它应该可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-23
      • 2021-11-20
      • 1970-01-01
      • 2016-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多