【问题标题】:How to send return statement to parent function?如何将返回语句发送到父函数?
【发布时间】:2017-06-29 18:18:30
【问题描述】:

不知道如何解释。我会用一个例子来试试。

例如,我使用以下函数作为数组上 for 循环的缩写:

function forEach(array, f) {
  var len = array.length, i;
  for (i = 0; i < len; i += 1) {
    f(i, array[i], len);
  }
};

我想这并不少见。但是在函数中替换以下for循环时会导致问题:

function test(someArray) {
  for (var i = 0; i < someArray.length; i++) {
    if (someArray[i] === 23) {
      return true;
    }
  }
  return false;
}

替换:

function test(someArray) {
  forEach(someArray, function(i, value) {
    if (value === 23) {
      return true;
    }
  });
  return false;
}

到达23时不返回函数test并返回true,但继续执行forEach之后的语句并返回false。

【问题讨论】:

  • 请添加一些数据和想要的结果。检查23 可以导致true、23 或[23, 23] 的集合。
  • @NinaScholz 好吧,这只是一个例子。我正在寻找一个通用的解决方案。我想也许有一种方法可以将 return 语句直接发送到父函数。但可能没有这样的事情。
  • @gavgrif 谢谢。修好了。

标签: javascript for-loop return


【解决方案1】:

有几种方法可以达到效果。这是一个简单的:

function test(someArray) {
  var result = false

  forEach(someArray, function(i, value) {
    if (value == 23) result = true;
  });

  return result;
}

请注意,value 应与 == 进行比较。单个= 用于分配,它只是替换value。

在这里使用forEach 的缺点是当value 是23 时循环不会停止。即使23 是列表中的第一个,它也会完成对所有项目的交互。使用for-return 组合,一旦找到23,迭代就会停止。

如果这让您担心,可以使用 a trick or two 停止 forEach,但 for-return 方法更简洁。

【讨论】:

    【解决方案2】:

    您的forEach() 函数需要返回一个值。否则当然你在调用forEach()之后总是会返回false。

    function forEach(array, f) {
      var len = array.length, i;
      for (i = 0; i < len; i += 1) {
        if (f(i, array[i], len)) {
            return true;
        }
      }
      return false;
    };
    
    function test(someArray) {
      return forEach(someArray, function(i, value) {
        return value == 23;
      });
    }
    

    【讨论】:

      【解决方案3】:

      首先,请使用与数组 API 中相同样式的回调。然后使用回调作为检查并将决定留给调用函数使用信息。

      在这种情况下,回调会查找一个数字,如果元素等于23,则返回true。调用函数在接收到true 时停止迭代并返回true。否则继续迭代,如果没有找到,返回值为false。

      function forEach(array, f) {
          var len = array.length,
              i;
      
          for (i = 0; i < len; i ++) {
              if (f(array[i], i, array)) {
                  return true;
              }
          }
          return false;
      }
      
      var cb = function (v) { console.log('value', v); return v === 23; };
      
      console.log('result', forEach([1, 2, 3, 4, 5, 23, 6, 7], cb));
      console.log('result', forEach([1, 2, 3, 4, 5, 6, 7, 33], cb));
      .as-console-wrapper { max-height: 100% !important; top: 0; }

      对于不同的方法,比如返回一个值,我建议返回项目而不是布尔值。如果没有找到,返回undefined。

      function forEach(array, f) {
          var len = array.length,
              i;
      
          for (i = 0; i < len; i ++) {
              if (f(array[i], i, array)) {
                  return array[i];
              }
          }
      }
      
      var cb = function (v) { console.log('value', v); return v === 23; };
      
      console.log('result', forEach([1, 2, 3, 4, 5, 23, 6, 7], cb));
      console.log('result', forEach([1, 2, 3, 4, 5, 6, 7, 33], cb));
      .as-console-wrapper { max-height: 100% !important; top: 0; }

      【讨论】:

      • 由于if 检查,循环是否变慢了?
      • 您的解决方案是否会处理内部函数发送返回语句的两个嵌套forEach?
      • 这取决于forEach 返回的内容。原来的Array#forEach 只使用回调进行迭代。 Array#filter 返回一个包含项目的数组,而回调返回一个布尔值,如上述情况。所以是的,它可以,这取决于你自己forEach的逗留和目的。
      猜你喜欢
      • 2019-05-10
      • 2011-10-16
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-17
      • 2011-10-26
      相关资源
      最近更新 更多