创建我自己的 array.prototype.map 方法。我如何访问该数组?

swo*_*ord 4 javascript arrays function ecmascript-6 array.prototype.map

因此,我试图创建一种完全模仿该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"
   }
];
Run Code Online (Sandbox Code Playgroud)

假设我想要创建一个返回仅包含电影标题及其 imdbRating 的对象列表的函数。在这种情况下,我可以使用以下map()方法:

let newList = movieList.map( (current) ({'title': current['Title'],     
               'rating': current['imdbRating'] }) );
Run Code Online (Sandbox Code Playgroud)

上面的代码行满足了我使用 map 方法实现目标所需的内容。但是,对于其他情况,语法可能有所不同

示例2:

let s = [1, 2, 3, 4];

let s2 = s.map( function(item) {
   return item*2;
});
Run Code Online (Sandbox Code Playgroud)

使用映射函数 s2 将返回一个数组,其中每个元素的值都是 s 数组中每个元素的值的两倍。现在,回到这篇文章的主题,我正在解决的问题给了我这样的概述:

Array.prototype.myMap = function(callback) {
   let newArray = [];
Run Code Online (Sandbox Code Playgroud)

据我所知,当数组调用该myMap方法时,它会插入两个参数:数组和函数。但我无法理解如何将元素上每个回调函数的值具体分配给方法newArray中的值myMap。特别是因为我不知道如何访问原始数组。

我知道我的尝试之一是荒谬的,因为我不知道如何访问数组的长度以及调用该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;
};
Run Code Online (Sandbox Code Playgroud)

到目前为止,我理解该map()方法的方式是,它需要 3 个参数、一个数组、一个函数以及将通过该函数放入的元素,而且我不太了解语法,无法迭代调用的数组map我的课程中没有教过我如何执行此操作的方法,而且我也没有找到任何可以解决此问题的在线资源。

Jac*_*ord 7

length不是一个方法 - 它只是一个属性。并且您需要传递this[i]callback正确的输出。

Array.prototype.myMap = function(callback) {
  let newArray = [];
  let x = this.length;
  for (let i = 0; i < x; i++) {
    let counter = callback(this[i]);
    newArray.push(counter);
  }
  return newArray;
};

let arr = [1, 2, 3];
arr = arr.myMap(e => e * 2);
console.log(arr);
Run Code Online (Sandbox Code Playgroud)

请注意,改变原型方法是一种非常糟糕的做法,尤其是在存在相同方法时创建新方法。(map具有 plus more 的所有功能myMap)。