繁体   English   中英

用forEach重写Map

[英]rewriting Map with forEach

forEach方法不返回带有值结果的新字符串。 如果我想使用forEach重写map方法,我不能使用命令push.forEach(array,callback)

我试图使用forEach方法将我的数组中的每个元素乘以2并将其存储在一个新数组中。 我不想要使用map方法的建议,因为我知道它已经这样做了。

不使用forEach方法我的代码如下:

function MultiplyByTwo(num) {
    return num * 2;
}

function HostMultiplyByTwo(array,instructions) {
    var output = [];
    for (i=0;i<array.length;i++) {
        output.push(instructions(array[i]))
    }
    return output;
}

var endresult = HostMultiplyByTwo([1,2,3],MultiplyByTwo)

如果forEach函数如下所示:

function forEach(array, callback) {
    for (var i =0;i<array.length;i++) {
        var result = callback(array[i])
    }
    return result;
}

现在我希望能够使用forEach方法运行HostMutiplyByTwo 这是我试过的。

function HostMultiplyByTwo(array,instructions) {
    var output = [];
    forEach(array,instructions) {
        output.push(result)
    }
    return output;
}

var endresult = HostMultiplyByTwo([1,2,3],MultiplyByTwo)

这显然不能用于某些原因。 据我所知, forEach方法只是迭代第一个参数,并在第一个参数的第二个参数中执行该函数。

  • 它之后是否存储了该操作的结果?
  • 有没有一个地方我可以看到我的浏览器使用的实际内置函数'forEach',因为我无法找到它正在做什么的精确定义?
  • 我不能使用push.forEach(数组,指令)。
  • 假设我有一个名为'freeze'的数组。 是否需要'冻结',对'冻结'中的每个元素执行操作,然后将这些操作的结果保存回'冻结'?
  • 我这样做是因为我想练习使用闭包和回调函数。 我理解map在对每个元素执行函数后返回一个数组,但我不明白如何使用forEach执行此操作。
  • 我在网上看过你可以使用'this.forEach',但我无法理解计算机如何解释'this'。

任何帮助深表感谢。

您认为这应该怎么做?

forEach(array,instructions) {
    output.push(result)
}

forEach只是一种方法 - 它不是像if那样的结构。 如果你使用函数语法(而不是内置方法),你需要做类似的事情

forEach(array, function (element) {
    output.push(instructions(element))
});

注意匿名函数包装将函数的结果推送到输出 - 你可以从map免费获得它。

您可以通过使用命名闭包来避免匿名函数

var pusher = function (element) {
    output.push(instructions(element))
};

forEach(array, pusher);

您甚至可以动态构建闭包

var pusherCreator = function (outputArray, callback) {
    var pusher = function(element) {
        outputArray.push(callback(element));
    };

    return pusher;
};

forEach(array, pusherCreator(output, instructions));

forEach函数中,您有:

for (var i =0;i<array.length;i++) {
  var result = callback(array[i])
}

它只是在每次迭代时为结果分配一个新值。 您需要将值分配给数组,因此:

var result = [];
for (var i =0;i<array.length;i++) {
  result.push(callback(array[i]));
}

现在在HostMultiplyByTwo函数中,您只需要:

var output = forEach(array,instructions)
return output;

要不就:

return forEach(array,instructions);

请注意,按照惯例,为大写字母保留以大写字母开头的变量名。 所有大写的变量都是常量。

所以整个事情看起来像:

 function multiplyByTwo(num) { return num * 2; } function forEach(array, callback) { var result = []; for (var i=0; i<array.length; i++) { result.push(callback(array[i])); } return result; } function hostMultiplyByTwo(array,instructions) { return forEach(array,instructions) } document.write(hostMultiplyByTwo([1,2,3], multiplyByTwo)); 

请注意,如果要处理稀疏数组并正确复制mapforEach (仅访问存在的成员),则需要测试源数组的每个i成员是否存在,因此forEach变为:

  for (var i=0; i<array.length; i++) {
    if (array.hasOwnProperty(i)) {
      result[i] = callback(array[i]);
    }
  }

因此,不存在的成员仍然不存在。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM