【问题标题】:_forEach implementation in JS returning undefinedJS 中的 _forEach 实现返回未定义
【发布时间】:2020-07-13 04:38:17
【问题描述】:

编辑:正如其他用户所指出的,这实际上是 _map 的实现,因为 _forEach 并不意味着返回数组的副本。

我试图了解像 _forEach 这样的函数是如何工作的。为此,我想出了一个 _forEach 实现。 但是,我的实现目前只是返回一个未定义元素的数组,但我真的不知道哪里出了问题。

function _forEach(arr, cb) {
  var storage = [];
  for (let i = 0; i < arr.length; i++) {
    storage.push(cb(arr[i], i, arr));
  }
  return storage;
}
var list = ["hay", "lal", "pay"];
list = _forEach(list, function(name, i, list) {
  name.replace("a", "");
});

console.log(list);

据我了解,storage.push(cb(arr[i], i, arr)) 应该将回调返回的值存储到新数组中,然后return storage 应该拥有更改后数组的副本。

但是调用后console.log(list)的结果只是[undefined, undefined, undefined]。 但是,如果我在回调中添加console.log(name.replace('a', '')),我可以看到过滤器被正确应用。那么为什么它不将更改后的元素存储到新数组中呢?

【问题讨论】:

  • 尝试在您的 _forEach 函数和您的调用中插入一些控制台日志,以跟踪幕后发生的事情。
  • 您的回调函数不返回任何内容,因此未定义。 _forEach 也应该是 _map 真的
  • @GetSet 我在回调中添加了console.log,我可以看到它正确过滤了单词,只是没有存储它们。
  • 不,您的函数没有返回语句。它只是 name.replace('a','') 没有返回值。 (function(name, i, list){ name.replace('a','') })('name',10, []) 返回undefined
  • 我想指出,@RaghulSk 的编辑对风格的看法备受争议,不应影响您对如何编写代码的决定。我不知道为什么有人会批准该编辑,好像它实际上以任何方式提高了可读性。

标签: javascript foreach functional-programming


【解决方案1】:
  1. 你正在做类似map 而不是forEach 的事情。查看Array.prototype.map了解更多信息。

  2. 你的回调没有返回值,因此它总是undefined

list = _forEach(list, function(name, i, list) {
  name.replace("a", "");
});

转换成

list = _forEach(list, function(name, i, list) {
  return name.replace("a", "");
});

【讨论】:

    【解决方案2】:

    如下需要添加回调函数的返回值。

    function _forEach(arr, cb) {
     
      var storage = [];
      for (let i = 0; i < arr.length; i++) {
        storage.push(cb(arr[i], i, arr));
      }
      return storage;
    }
    var list = ["hay", "lal", "pay"];
    list = _forEach(list, function(name, i, list) {
      return name.replace("a", "");
    });
    
    console.log(list);

    【讨论】:

      【解决方案3】:

      有时词汇表也很重要, 你正在使用(实现)一个 forEach 并期望它表现得像一张地图。

      Array#forEach 只是对列表中的每个项目运行回调,没有其他目的...

      Array#map 确实是我们希望将 A 中的项目映射B 并将它们累积到一个新数组中 (Functor f =&gt; (a → b) → f a → f b)。

      const original = ["hay", "lal", "pay"];
      
      const withoutA = original.map(
        (word) => word.replace(/a/gi, ''),
      );
      
      console.log(
        'original without "a"',
        withoutA
      );

      【讨论】:

        猜你喜欢
        • 2018-09-28
        • 2018-03-26
        • 1970-01-01
        • 2020-06-07
        • 2020-07-16
        • 2019-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多