JavaScript數組應用之forEach、map、filter、reduce

JavaScript數組方法講解

 

ES3.0的方法與ES5.0的方法分別有:

  1. 改變原數組:reverse,sort,push,pop,unshift,shift, splice
  2. 不可改變原數組:進行操作後原數組不改變,可將改變的數組取出使用forEach, filter, map, reduce, reduceRight,   slice, concat, join,->split,tostring

一、push可以接收任意數量的參數,把它們逐個添加到數組末尾,並返回修改後數組的長度。

push數組的實現:在原型鏈上編程有助於所有數組直接調用而不需要調用函數來使用。

Array.prototype.push = function () {

var len = arguments.length;

for(var i = 0; i < len; i ++){

this[this.length] = arguments[i];

}

return this.length;

}

pop:數組末尾移除最後一項,減少數組的 length 值,然後返回移除的項

shift():刪除原數組第一項,並返回刪除元素的值;如果數組爲空則返回undefined 

unshift:將參數添加到原數組開頭,並返回數組的長度 。

sort():按升序排列數組項——即最小的值位於最前面,最大的值排在最後面。提供接口供人們自己定義自己想要的函數功能。

sort方法-->提供接口函數

1、必須兩個形參

2、看返回值 1)當返回值爲負數時那麼前面的數在前面

2)爲正數時,後面的數在前面

3)爲0時,不動

arr.sort(function (a, b) {

//return a-b;//升序

// return b-a;降序

return Math.random() - 0.5;//隨機排序

});

Splice:很強大的數組方法,它有很多種用法,可以實現刪除、插入和替換。splice(起始位置,要刪除的項數,[要插入的數(可多個)])

二、

 Concat:將參數添加到原數組中。這個方法會先創建當前數組一個副本,然後將接收到的參數添加到這個副本的末尾,最後返回新構建的數組

Tostring:將傳過的參數轉爲字符串形式

Slice:返回從原數組中指定開始下標到結束下標不包括結束下標之間的項組成的新數組。slice()方法可以接受一或兩個參數,即要返回項的起始和結束位置。

Join:join(separator): 將數組的元素組起一個字符串,以separator爲分隔符,省略的話則用默認用逗號爲分隔符,該方法只接收一個參數:即分隔符。

Split:split(separator):將字符串拆分爲一個數組以separator爲分隔符,該方法只接收一個參數:即分隔符。

以上這些是ES3.0的數組方法

而新增的ES5.0方法則有以下方法:

1、forEach:對數組進行遍歷循環,對數組中的每一項運行給定函數。這個方法沒有返回值。參數都是function類型,默認有傳參,參數分別爲:遍歷的數組內容;第對應的數組索引,數組本身。

先定義一個數組方便後續各種方法的調用舉例;

var arr = [

{ name: "劉飛", des: '頸椎不好', sex: 'm', age: 23 },

{ name: '劉迎', des: '聖體很好', sex: 'f', age: 19 },

{ name: '王淑', des: '聖體不行', sex: 'f', age: 20 },

{ name: '王雷', des: '你沒見過的人', sex: 'm', age: 21 },

{ name: '劉浪', des: '很皮', sex: 'm', age: 22 }

];

必須傳一個函數參數 func (ele元素每一項, index索引位, self自身),第二個this指向可傳可不傳不傳則函數執行時指向window

var oLiArray = document.getElementsByTagName('li');

arr.forEach(function(ele, index, self) {

this[index].innerText = ele.name;

}, oLiArray)

輸出結果:

結果便是所傳的數組每一項依次調用此函數,來對這個數組實現某一功能(此例子是將數組中的每一項插入到li中)

當然我們也可以對其重寫來實現相同的功能:當然也是在數組的原型鏈上編程方便數組的直接使用

Array.prototype.myForEach = function (func) {

//可以傳兩個參數,function 和this(function使用時的指向),用parma2來接受this

//_arr來接收當前數組調用(誰調用就指向誰)

var _arr = this, len = _arr.length, parma2 = arguments[1] || window;

for(var i = 0; i < len; i ++) {

func.apply(parma2, [_arr[i], i, _arr]);

}

}

重新進行調用也能得到以上結果。

filter:過濾”功能,數組中的每一項運行給定函數,返回滿足過濾條件組成的數組。

eg:

var newArr = arr.filter(function(ele, index, self) {

if(ele.sex == 'm')

return true;

});

結果爲;

在函數裏面判斷true還是false,若是true則返回當前項,否則過濾掉當前項。

對其重寫:

Array.prototype.myFilter = function (func) {

//新增加定義一個空數組來接收最後結果然後返回

var _arr = this, len = _arr.length; parma2 = arguments[1] || window, newArr = [];

for (var i = 0; i < len; i++) {

func.apply(parma2, [_arr[i], i, _arr]) ? newArr.push(deepClone({}, _arr[i])) : '';

}

return newArr;

}

Map:指“映射”,對數組中的每一項運行給定函數,返回每次函數調用的結果組成的數組。

假如X ---------------+10---------> Y 即X中的每一項都增加10然後存到另一個數組中即映射關係

使用方法:

var newArr = arr.map(function(ele, index, self) {

ele.name += 10;

return ele;//返回的還是原來的每一項

})

結果爲:

 

重寫:

Array.prototype.myMap = function(func) {

var _arr = this, len = _arr.length, parma2 = arguments[1] || window, newArr = [];

for(var i = 0; i < len; i ++) {

newArr.push(deepClone({}, func.apply(parma2, [_arr[i], i, _arr])));//使用深度克隆不會影響原來的數組

}

return newArr;//返回一個新數組接受

}

Reduce和reduceRight:reduce()方法從數組的第一項開始,逐個遍歷到最後,reduceRight則是從右往左遍歷。傳給 reduce()和 reduceRight()的函數接收 4 個參數:前一個值、當前值、項的索引和數組對象。這個函數返回的任何值都會作爲第一個參數自動傳給下一項。第一次迭代發生在數組的第二項上,因此第一個參數是數組的第一項,第二個參數就是數組的第二項。

使用方法:

var initialValue = {name: '22'};

var lastValue = arr.reduce(function(preValue, curValue, index, self) {

preValue.name += 1;

return preValue

}, initialValue);

調用結果:

每次從左往右加一,沒上一次調用的結果作爲下一次使用進行累加;

重寫也可以實現:

Array.prototype.myReduce = function(func,initialValue) {//這裏必須傳兩個參數,當然第三個參數和上面第二個一樣可傳可不傳

var _arr = this, len = _arr.length, parma2 = arguments[2];

for(var i = 0; i < len; i ++) {

initialValue = func.apply(parma2, [initialValue, _arr[i], i, _arr]);

}

return initialValue;

}

應用:將一個字符串分開並將其全部存入一個數組中,其屬性和值分別爲原來字符串的數:

eg:

var cookie = "1=a;2=b;3=c;4=d;5=e;6=f;7=g";

function parseCookie(str) {

var cookieArr = str.split(";");

var cookObj = {};

cookieArr.reduce(function(pre, next, index, self){

var nextArr = next.split('=');

cookObj[nextArr[0]] = nextArr[1];

return pre;

}, cookObj)

return cookObj;

}

var cook = parseCookie(cookie);

console.log(cook);

 

輸出結果:

儘管reduce方法難有點難但是用起來還是很好用的;

every方法:判斷數組中的每一項是不是都符合要求,若不則返回false(相當於&&)

some方法:判斷數組中是不是存在某一項符合要求,若有則返回true。(相當於||)

var flag = arr.every(function(ele, index, self) {

return ele.age > 20;

});

var flag1 = arr.some(function(ele, index, self) {

return ele.age > 20;

});

輸出結果

 

對其重寫:

Array.prototype.myEvery = function(func) {

//增加一個判斷true的變量便於返回

var _arr = this, len = _arr.length; parma2 = arguments[1] || window, flag = true;

for(var i = 0; i < len; i ++) {

if(!func.apply(parma2, [_arr[i], i, _arr])){

flag = false;

}

}

return flag;

}

some方法類似

 

 

重寫的主要目的是讓大家能夠更好的理解底層原理,方便使用

也就不需要很依賴別人的方法,增加自主能力

 

以上便是JavaScript中常用的數組方法。謝謝採納,建議自己寫寫

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章