色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

javascript 封裝 map

錢諍諍1年前7瀏覽0評論

Javascript 中的 map() 方法可以很方便地實現數組的映射轉換,將一個數組中的每個元素都進行某種操作后,返回一個全新的數組,而不改變原數組。但是,由于其參數冗長,使用時不夠簡潔,而且容易造成代碼耦合,因此封裝 map() 方法就顯得尤為重要。

以下是一個實現數組每個元素平方的原生 map() 方法實例:

var nums = [1, 2, 3, 4, 5];
var squareNums = nums.map(function(num){  
return num * num;  
});  
console.log(squareNums);    // [1, 4, 9, 16, 25]

下面是一個對 map() 方法的簡單封裝:將數組每個元素覆蓋為所有元素相加之和的結果。這種方式在實際開發中會大有裨益。

Array.prototype.myMap = function(fn) {
var arr = this;
var newArr = [];
for(var i = 0; i< arr.length; i++) {
newArr.push(fn(arr[i], i, arr));
}
return newArr.reduce(function(prev, cur) { // reduce函數相當于原生 map() 方法的新增操作 
return prev + cur;
});
};
var nums = [1, 2, 3, 4, 5];
var res = nums.myMap(function(item, index, array) {
return item;  // 操作方法
});
console.log(res);  // 15

可以看到,myMap() 方法是通過 Array 對象與原生 reduce() 方法的結合實現數組映射轉換的。該方法接受一個參數,即一個函數(也可以稱為操作方法),這個操作方法接受三個參數:當前值(item)、索引(index)和數組對象(array),并在最后返回一個新數組,其中包含了對當前元素的操作結果。

由于該方法定義在數組的 prototype 屬性中,可以通過數組實例直接調用該方法,從而避免大量重復的代碼編寫。比如:

var arr1 = [1,2,3,4,5];
var arr2 = [10,9,8,7,6];
var res1 = arr1.myMap(function(item) { return item * 2; });
var res2 = arr2.myMap(function(item) { return item / 2; });
console.log(res1, res2);  // 30, 25

以上代碼展示了如何通過 myMap() 方法實現兩個全新數組各自操作機制(本例分別為乘以2和除以2),而沒有污染原數組本身。

總結一下,封裝原生 JS 中的 map() 方法可以為了代碼復用性、開發效率、函數使用方式方面帶來不少便利。不過,需要注意一下幾點:

  • 封裝方法必須定義在Array對象的prototype屬性中,否則將會導致找不到該方法;
  • 由于原生的 map() 方法在 ES5 中有了標準的定義,所以使用自定義的新封裝方法時,最好要避免與原生 map() 方法同名;
  • 個人認為,myMap() 方法定義為數組所有元素相加之和不是一個很合適的例子,但能突顯自定義方法的基礎思路。