迭代方法
ECMAScript 5為數(shù)組定義了5個(gè)迭代方法。每個(gè)方法都接受兩個(gè)參數(shù):要在每一項(xiàng)上運(yùn)行的函數(shù)和(可選的)運(yùn)行該函數(shù)的作用域?qū)ο?影響this的值烤黍。傳入這些方法中的函數(shù)會(huì)接收三個(gè)參數(shù):數(shù)組項(xiàng)的值吭净、該項(xiàng)在數(shù)組中的位置和數(shù)組對(duì)象本身。根據(jù)使用的方法不同,這個(gè)函數(shù)執(zhí)行后的返回值可能會(huì)也可能不會(huì)影響方法的返回值找田。以下是5個(gè)迭代方法的作用不恭。
方法名 | 作用 |
---|---|
every() | 對(duì)數(shù)組中每一項(xiàng)都運(yùn)行該函數(shù)叶雹,如果該函數(shù)對(duì)每一項(xiàng)都返回true,則返回true |
filter() | 對(duì)數(shù)組中每一項(xiàng)都運(yùn)行該函數(shù)换吧,返回該函數(shù)會(huì)返回true的項(xiàng)組成的數(shù)組 |
forEach() | 對(duì)數(shù)組中每一項(xiàng)都運(yùn)行該函數(shù)折晦,該方法沒(méi)有返回值 |
map() | 對(duì)數(shù)組中每一項(xiàng)都運(yùn)行該函數(shù),返回每次函數(shù)調(diào)用的結(jié)果組成的數(shù)據(jù) |
some() | 對(duì)數(shù)組中每一項(xiàng)都運(yùn)行該函數(shù)沾瓦,如果該函數(shù)對(duì)任一項(xiàng)返回true满着,則返回true |
以上方法都不會(huì)修改數(shù)組中包含的值谦炒。
注意:
1. every()和some()
every()和some()方法最相似,every()執(zhí)行的時(shí)候风喇,若數(shù)組中每一項(xiàng)都返回true宁改,則返回true,否則返回false魂莫,而some()方法執(zhí)行時(shí)还蹲,只要數(shù)組中有一項(xiàng)返回true,則結(jié)果就返回true耙考。舉例如下:
var values = [5, 6, 7, 8, 9, 8, 7, 6, 5];
var everyResult = values.every(function(item, index, array) {
return (item > 6);
});
alert(everyResult);//false
var someValue = values.some(function(item, index, array) {
return (item > 6);
});
alert(someValue);//true
以上代碼調(diào)用了every()和some()函數(shù)谜喊,傳入的函數(shù)只要給定項(xiàng)大于6就返回true。every()函數(shù)返回false倦始,因?yàn)橹挥胁糠謹(jǐn)?shù)組項(xiàng)符合條件斗遏。對(duì)于some(),結(jié)果就是true鞋邑,因?yàn)橹辽儆幸豁?xiàng)是大于6最易。
2. filter()
filter()函數(shù)利用指定的函數(shù)確定是否在數(shù)組中包含某一項(xiàng)。例如要返回一個(gè)所有值都大于6的數(shù)組炫狱,可以如下使用:
var values = [5, 6, 7, 8, 9, 8, 7, 6, 5];
var filterResult = values.filter(function(item, index, array) {
return (item > 6);
});
alert(filterResult);//[7,8,9, 8, 7]
filter方法對(duì)查詢(xún)符合某些條件的所有數(shù)據(jù)非常又用藻懒。
3. map()
map()函數(shù)也返回一個(gè)數(shù)據(jù),而這個(gè)數(shù)據(jù)的每一項(xiàng)都實(shí)在原始數(shù)據(jù)中的對(duì)應(yīng)項(xiàng)上運(yùn)行傳入函數(shù)的結(jié)果视译。例如嬉荆,要給數(shù)據(jù) 中每一項(xiàng)乘以2,然后返回這些乘積組成的數(shù)據(jù)酷含,則可以用如下方法實(shí)現(xiàn):
var values = [5, 6, 7, 8, 9, 8, 7, 6, 5];
var mapResult = values.map(function(item, index, array) {
return item * 2;
});
alert(mapResult);//[10,12,14,16,18,16,14,12,10]
map()方法適合創(chuàng)建包含的項(xiàng)與另一個(gè)數(shù)組一一對(duì)應(yīng)的數(shù)據(jù)鄙早。
4.forEach()
對(duì)數(shù)組中每一項(xiàng)運(yùn)行傳入的函數(shù),這個(gè)函數(shù)沒(méi)有返回值椅亚,本質(zhì)上與for循環(huán)迭代數(shù)據(jù)一樣限番。
var values = [5, 6, 7, 8, 9, 8, 7, 6, 5];
var forEachResult = values.forEach(function(item, index, array) {
//執(zhí)行某些操作
});
通過(guò)迭代方法,可以大大方便處理數(shù)組的任務(wù)呀舔。
歸并方法
ECMAScript5還有兩個(gè)歸并數(shù)組的方法:reduce()和reduceRight()弥虐。這兩個(gè)方法都會(huì)迭代數(shù)組的所有項(xiàng),然后構(gòu)建一個(gè)最終返回的值媚赖。其中reduce()方法從數(shù)據(jù)第一項(xiàng)開(kāi)始霜瘪,逐個(gè)遍歷到最后,reduceRight()則從數(shù)據(jù)最后哦一項(xiàng)開(kāi)始惧磺,向前遍歷到第一項(xiàng)颖对。
這兩個(gè)方法都接收兩個(gè)參數(shù):一個(gè)在每一項(xiàng)上調(diào)用的函數(shù)和(可選)作為歸并基礎(chǔ)的初始值。傳給reduce()和reduceRight()的函數(shù)接收4個(gè)參數(shù):前一個(gè)值磨隘、當(dāng)前值缤底、項(xiàng)的索引和數(shù)組對(duì)象顾患。這個(gè)函數(shù)返回的任何值都會(huì)作為參數(shù)自動(dòng)傳遞給下一項(xiàng)。第一次迭代發(fā)生在數(shù)組的第二項(xiàng)上个唧,因此第一個(gè)參數(shù)是數(shù)組的第一項(xiàng)江解,第二個(gè)參數(shù)是數(shù)組的第二項(xiàng)。
var numbers = [5,4,3,2,1];
var reduceResult = numbers.reduce(function(preVal, currVal, index, array) {
return preVal + currVal;
});
alert(reduceResult);//15
第一次執(zhí)行回調(diào)函數(shù)坑鱼,preVal是5膘流,currVal是4絮缅,第二次preVal是9鲁沥,currVal是3,該過(guò)程持續(xù)到數(shù)組便利完耕魄,最后返回結(jié)果画恰。
reduceRight()作用類(lèi)似,只不過(guò)方向相反而已吸奴。
var numbers = [5,4,3,2,1];
var reduceResult = numbers. reduceRight(function(preVal, currVal, index, array) {
return preVal + currVal;
});
alert(reduceResult);//15
使用時(shí)候選擇reduce()還是reduceRight()主要取決于從哪頭開(kāi)始遍歷數(shù)組允扇,除此之外,他們完全相同则奥。
》》》不忘初心考润,繼續(xù)前進(jìn)!》》》