因此,我正在尝试创建一个完全模仿Array.prototype.map()
方法的方法,但我有很多困惑。我想主要的问题在于它的语法。我知道有很多不同的方法可以实现map
方法的实用化,例如:
示例1:
假设我有一个对象数组-
var movieList = [
{"Title" : "Inception",
"Awards" : "4 oscars",
"Language" : "English",
"imdbRating" : "8.8"
},
{"Title" : "Inception2",
"Awards" : "44 oscars",
"Language" : "English and Spanish",
"imdbRating" : "9.8"
},
{"Title" : "Interstellar",
"Awards" : "10 oscars",
"Language" : "English",
"imdbRating" : "9.5"
}
];
假设我想创建一个函数,该函数返回仅包含电影标题及其imdbRating的对象列表。在这种情况下,我可以使用map()
方法:
let newList = movieList.map( (current) ({'title': current['Title'],
'rating': current['imdbRating'] }) );
上面的代码行满足了我使用map方法实现目标的需要。但是,对于其他情况,语法可能不同
示例2:
let s = [1, 2, 3, 4];
let s2 = s.map( function(item) {
return item*2;
});
使用map函数s2将返回一个数组,其中每个元素的值都是s数组中每个元素的两倍。现在,回到这篇文章的主题,我正在研究的问题给了我这个提纲:
Array.prototype.myMap = function(callback) {
let newArray = [];
我知道当一个数组调用myMap
方法时,它插入了2个参数,即数组和一个函数。但我无法理解如何将元素上每个回调函数的值具体赋值给myMap
方法中的newArray
。特别是因为我不知道如何访问原始数组。
我知道的一个尝试很荒谬,因为我不知道如何访问数组的长度以及调用myMap
方法的数组本身-
Array.prototype.myMap = function(callback) {
let newArray = [];
let x = this.length();
for(let i=0; i<x; i++){
let counter = callback();
newArray.push(counter);
}
return newArray;
};
到目前为止,我对map()
方法的理解是,它需要3个参数,一个数组,一个函数,以及将通过函数放置的元素,我对语法不太熟悉,无法迭代调用map
方法的数组,而且在我的课程中没有任何地方教过我如何做到这一点,我也没有找到任何在线资源可以解决这个问题。
6条答案
按热度按时间ygya80vv1#
length
不是一个方法,它只是一个属性。您需要将this[i]
传递给callback
,以获得正确的输出。请注意,改变原型方法是非常糟糕的做法,尤其是在存在相同方法时创建一个新方法。(
map
具有myMap
的所有功能以及更多功能)。dfuffjeb2#
这是实际
map
Polyfill的简化版本。您需要使用this.length
获取length
。并将循环中的当前项、它的索引和数组本身作为参数传递给callback
注意:
map
方法也使用thisArg
作为参数。如果您想使用它,需要将callback
与thisArg
合并为this
qlckcl4x3#
这里是您可以了解javascriptMap函数更多信息的地方:https://www.w3schools.com/jsref/jsref_map.asp
实现map方法实际上比你想象的要容易得多。下面是一个非常简单的例子,它将完全执行https://www.w3schools.com/jsref/jsref_map.asp中的map方法:
因此,map方法简单地返回一个数组,通过该数组的值Map到原始数组的值,方法是对每个值运行一个指定的函数作为参数。
**注:**该方法跳过原始map函数的可选参数,该参数指定
this
值deyfvvtc4#
这是
myMap
函数的工作版本。模仿这些方法的一部分可能会让人困惑,那就是
this
关键字在javascript中的工作方式。这是一篇MDN参考文章。s5a0g9ez5#
n3ipq98p6#
可以利用spread操作符来做这样的事情
使用中:
您肯定可以在此基础上构建,因为这仍然有Array.prototype.slice()的警告