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;
}
现在我希望能够使用HostMutiplyByTwo
方法运行forEach
。这是我试过的。
function HostMultiplyByTwo(array,instructions) {
var output = [];
forEach(array,instructions) {
output.push(result)
}
return output;
}
var endresult = HostMultiplyByTwo([1,2,3],MultiplyByTwo)
由于某些原因,这显然不起作用。我知道forEach
方法只是迭代第一个参数,并在第一个参数的第二个参数中执行该函数。
forEach
执行此操作。非常感谢任何帮助。
答案 0 :(得分:4)
您认为这应该怎么做?
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));
答案 1 :(得分:-1)
在 forEach 功能中,你有:
for (var i =0;i<array.length;i++) {
var result = callback(array[i])
}
只是在每次迭代时为 result 分配一个新值。您需要将值分配给数组,因此:
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]);
}
}
因此,不存在的成员仍然不存在。