[英]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
执行此操作。 任何帮助深表感谢。
您认为这应该怎么做?
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));
请注意,如果要处理稀疏数组并正确复制map和forEach (仅访问存在的成员),则需要测试源数组的每个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.