在javascript中创建了我自己的forEach函数,但它返回undefined

时间:2016-11-22 01:10:04

标签: javascript arrays foreach

我正在学习的Javascript课程的一部分,你应该创建自己的forEach函数,它接受两个参数,一个数组和一个回调。它应该传递回调每个元素,它的索引和数组本身。应该返回undefined。这是我的:

function myForEach (arr, cb) {
  for(var i = 0; i < arr.length; i++) {
    var elem = arr[i];

    cb(elem, i, arr);
  }
}

然后,你应该在另一个函数中引用它并使用它来执行一些示例函数。特别是,您应该编写一个接受数组和回调作为参数的函数,它应该将回调传递给每个元素,它的相应索引和数组本身。然后它应该返回一个新数组,其中新数组中的每个元素都是回调的返回值。这是有问题的功能:

function myMap(arr, cb) {
  var mapped = [];

  mapped.push(myForEach(arr, cb));

  return mapped;
}

我不明白为什么(在这个例子中),当我传递的回调应该返回一个值时,我将未定义为我的值:

console.log(myMap([1, 2, 3], function(ele, i, arr){
  return ele * i;
}));
// [0, 2, 6] expected return value

一般来说,在平衡返回undefined与不返回的内容以及如何将回调中的值实际推送到空数组中时,有点困惑。

5 个答案:

答案 0 :(得分:0)

关于这一行有一些东西:

mapped.push(myForEach(arr, cb));

您只是添加一个未定义的&#39;值(这是&#39; myForEach&#39;函数返回的内容)为空数组。

答案 1 :(得分:0)

myForEach()目前正在直接从return接收其值,该undefined不包含cb语句以提供值(因此,它返回.push()默认情况下)。

myForEach()cb()之间,myMap()正在接收每个.push()的结果,并将其丢弃,而不是将其提供给cb()。< / p>

为避免这种情况,您需要移动步骤,以便mapped.push(cb(elem, i, arr)); myForEach()立即相互关联:

elem

您仍然可以使用cb,在此处移动它来执行迭代,因此mapped可以处理每个function myMap(arr, cb) { var mapped = []; myForEach(arr, function (elem, i, arr) { mapped.push(cb(elem, i, arr)); }); return mapped; } 并推送到{{1}}:

{{1}}

答案 2 :(得分:0)

mapforEach的回调是&#34;我应该对每个元素做什么&#34; - 并且你在myMap的每个元素中都没有像在myForEach的每个元素中那样做同样的事情。

myMap内,您要这样做:对于arr的每个元素,调用myMap的回调,然后将结果推送到结果中数组。(强调部分是每次myForEach运行时需要使用的myMap回调。)

同时,如果您想将[1, 2, 3]映射到[0, 2, 6]myMap回调就是multiply each element with its index and return that value。所以你绝对需要两个不同的回调。

简而言之,

  

myForEach(arr, function(element, i, ary) { mapped.push(cb(element, i ary)); });

答案 3 :(得分:0)

地图回调范例的术语起初可能有点令人困惑。

map方法(例如Array.map())不是映射函数/回调。它是一个循环,它将回调函数应用于数组的每个项目。

回调执行映射 - 它将数组映射(或翻译)为另一个值。

因此,你的callback()函数应该将一个数组项(不是数组)作为参数,并返回一个数组项。 map函数调用数组中每个项的回调,并将结果组装成一个新数组。 (或者,它可以返回一个对象,或者改变原始数组)。

例如:

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

mycopy = function(element) {
    return element;
}

然后您可以使用map复制MyArray的实例:

var oldarray = [...];

var newarray = mymap(oldarray, mycopy);

所有这一切的重点在于,您可以轻松地将mycopy()替换为更有用的内容,包括在别处定义的函数或内联匿名函数:

var positives = mymap(oldarray, Math.abs);

答案 4 :(得分:0)

这是你的问题。

console.log(myMap([1, 2, 3], function(ele, i, arr){
  return ele * i;
}));

在第二个参数中,您尝试传递匿名函数。由于提升过程,你不能这样做。此外,在执行此函数之前没有传递给此函数,因此返回undefined。