使用forEach

时间:2016-01-11 01:42:58

标签: javascript loops dictionary asynchronous 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;
}

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

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

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

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

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

非常感谢任何帮助。

2 个答案:

答案 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]);
    }
  }

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