我正在学习的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与不返回的内容以及如何将回调中的值实际推送到空数组中时,有点困惑。
答案 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)
map
和forEach
的回调是&#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。