forEach的用法
數(shù)組.forEach(function(數(shù)組的每個(gè)元素){
//code
});
具體的代碼如下:
var array1 = ['a', 'b', 'c'];
array1.forEach(function(element) {
console.log(element);// 'a' 'b' 'c'
});
看起來就是一個(gè)簡(jiǎn)單的循環(huán)拴孤,只不過比for循環(huán)的格式看起來簡(jiǎn)單一些脾歧,但是這個(gè)里面沒辦法獲取到當(dāng)前元素的標(biāo),如果一定要用forEach獲取元素的下標(biāo)演熟,你可以自己添加一個(gè)變量再循環(huán)內(nèi)部自增,但是不建議這么做蚕冬,選擇for循環(huán)也是很不錯(cuò)的获三。
map的用法
數(shù)組.map(function(當(dāng)前元素, 當(dāng)前元素索引, 當(dāng)前數(shù)組){
//code
},一般不寫棺聊,默認(rèn)this);
var array1 = ['a', 'b', 'c'];
var arr2 = array1.map(function(element,index,arr) {
return element + '1';
});
console.log(array1); //a,b,c
console.log(arr2); //a1,b1,c1
map可以只用于簡(jiǎn)單的循環(huán)作喘,也可以加上返回值返回一個(gè)新的數(shù)組,而且不會(huì)改變?cè)瓟?shù)組。
reduce的用法
數(shù)組.reduce(function (計(jì)算結(jié)束后的返回值豌熄,當(dāng)前元素囱持,當(dāng)前元素索引,當(dāng)前數(shù)組){
//code
});
var array1 = ['a', 'b', 'c'];
var num = array1.reduce(function(total, element) {
console.log(total); //a ab abc
return total + element;
});
console.log(num); //abc
一般計(jì)算的時(shí)候就會(huì)想起reduce,用起來很方便,求個(gè)和求個(gè)積什么的分分鐘。返回值就是我們要的結(jié)果骗露。
filter的用法
數(shù)組.filter(function(當(dāng)前元素述寡,當(dāng)前元素索引,當(dāng)前數(shù)組){
//code
});
var array1 = [1, 2, 3, 4];
var arr2 = array1.filter(function(element, index, arr) {
return element > 2;
});
console.log(arr2); //3,4
filter的結(jié)構(gòu)和map的結(jié)構(gòu)差不多惭婿,并且filter最后也會(huì)返回一個(gè)新的數(shù)組换吧,但是filter主要用于判斷贯莺,判斷之后直接返回符合要求的元素还蹲,但是這個(gè)例子中要是把filter直接換成map,結(jié)果就是false,false,true,true,這并不是我們想要的結(jié)果炫狱。
總結(jié):
這四個(gè)都有各自的側(cè)重點(diǎn)酷含,需要了解以后根據(jù)自己的需求挑選呀舔。
尤雨溪形象的解釋媚赖,我覺得很實(shí)用,解釋的很通俗江解,所以在最后附上:
假設(shè)我們有一個(gè)數(shù)組,每個(gè)元素是一個(gè)人。你面前站了一排人。
foreach 就是你按順序一個(gè)一個(gè)跟他們做點(diǎn)什么井辜,具體做什么,隨便:
people.forEach(function (dude) {
dude.pickUpSoap();
});
map 就是你手里拿一個(gè)盒子(一個(gè)新的數(shù)組)破托,一個(gè)一個(gè)叫他們把錢包扔進(jìn)去阐虚。結(jié)束的時(shí)候你獲得了一個(gè)新的數(shù)組侮叮,里面是大家的錢包亥宿,錢包的順序和人的順序一一對(duì)應(yīng)碍庵。
var wallets = people.map(function (dude) {
return dude.wallet;
});
reduce 就是你拿著錢包,一個(gè)一個(gè)數(shù)過去看里面有多少錢岸股汀?每檢查一個(gè)哪怔,你就和前面的總和加一起來叉信。這樣結(jié)束的時(shí)候你就知道大家總共有多少錢了营袜。
var totalMoney = wallets.reduce(function (countedMoney, wallet) {
return countedMoney + wallet.money;
}, 0);
補(bǔ)充一個(gè) filter 的:
你一個(gè)個(gè)錢包數(shù)過去的時(shí)候,里面錢少于 100 塊的不要(留在原來的盒子里),多于 100 塊的丟到一個(gè)新的盒子里距淫。這樣結(jié)束的時(shí)候你又有了一個(gè)新的數(shù)組绞绒,里面是所有錢多于 100 塊的錢包:
var fatWallets = wallets.filter(function (wallet) {
return wallet.money > 100;
});
最后要說明一點(diǎn)這個(gè)類比和實(shí)際代碼的一個(gè)區(qū)別,那就是 map 和 filter 都是 immutable methods榕暇,也就是說它們只會(huì)返回一個(gè)新數(shù)組蓬衡,而不會(huì)改變?cè)瓉淼哪莻€(gè)數(shù)組,所以這里 filter 的例子是和代碼有些出入的(原來的盒子里的錢包減少了)彤枢,但為了形象說明狰晚,大家理解就好。