本文實(shí)例講述了JavaScript遍歷數(shù)組的三種方法map、forEach與filter。分享給大家供大家參考,具體如下:
前言
近一段時(shí)間,因?yàn)轫?xiàng)目原因,會(huì)經(jīng)常在前端對(duì)數(shù)組進(jìn)行遍歷、處理,JS自帶的遍歷方法有很多種,往往不加留意,就可能導(dǎo)致知識(shí)混亂的現(xiàn)象,并且其中還存在一些坑。前端時(shí)間在ediary中總結(jié)了js原生自帶的常用的對(duì)數(shù)組遍歷處理的方法,分別為:map、forEach、filter,在講解知識(shí)點(diǎn)的同時(shí),會(huì)類比相識(shí)的函數(shù)進(jìn)行對(duì)比,這樣會(huì)有助于思考方法的利與弊。
map()
方法返回一個(gè)由原數(shù)組中的每個(gè)元素調(diào)用一個(gè)指定方法后的返回值組成的新數(shù)組
var newArray = ["1","2","3"].map(fucntion(e,i,arr){return parseInt(e,10)})
3.1 支持return返回值;
3.2 return是啥,相當(dāng)于把數(shù)組中的這一項(xiàng)變?yōu)樯叮ú⒉挥绊懺瓉淼臄?shù)組,只是相當(dāng)于把原數(shù)組克隆一份,把克隆的這一份數(shù)組中的對(duì)應(yīng)項(xiàng)改變了)
3.3 map只能對(duì)元素進(jìn)行加工處理,產(chǎn)生一個(gè)新的數(shù)組對(duì)象。而不能用它來進(jìn)行篩選(篩選用filter),為什么不能,看個(gè)例子就知道了:
4.1 在字符串中使用
在一個(gè)String上使用map方法獲取字符串中每個(gè)字符所對(duì)應(yīng)的ASCII碼組成的數(shù)組
var map = Array.prototype.mapvar a = map.call("Hello World", function(e){return e.charCodeAt(0);})// a的值為[72,101,108,108,111,32,87,111,114,108,100]
5.1 很多時(shí)候,map給回調(diào)函數(shù)傳的是一個(gè)值,但是也有可能傳2個(gè)、3個(gè)值,例如下面的例子
var map = Array.prototype.mapvar a = map.call("Hello World", function(e){return e.charCodeAt(0);})// a的值為[72,101,108,108,111,32,87,111,114,108,100]
為什么會(huì)這樣,因?yàn)閜arseInt就是一個(gè)函數(shù),它就是作為map的一個(gè)回調(diào)函數(shù),parseInt接收兩個(gè)參數(shù),一個(gè)是String,一個(gè)是進(jìn)制
上面的函數(shù)就可以化為:
["1","2","3"].map(parseInt(string, radix));
即
["1","2","3"].map(function(string, radix){return parseInt(string, radix)})// 所以才返回結(jié)果為:[1, NaN, NaN]
6.1 Map對(duì)象
es6提供一個(gè)對(duì)象Map,看看這個(gè)Map建的對(duì)象到底是啥東西
它是一個(gè)對(duì)象,size是它的屬性,里面的值封裝在[[Entries]]這個(gè)數(shù)組里面
myMap.set(1, "a"); // 相當(dāng)于java的map.put();myMap.set(2, "b");myMap.set(3, "c");myMap.size();myMap.get(1);myMap.get(2);myMap.get(3);
forEach()
方法返回一個(gè)由原數(shù)組中的每個(gè)元素調(diào)用一個(gè)指定方法后的返回值組成的新數(shù)組
forEach方法中的function回調(diào)有三個(gè)參數(shù),
[].forEach(function(value, index, array))
3.1 這個(gè)方法沒有返回值,僅僅是遍歷數(shù)組中的每一項(xiàng),不對(duì)原來數(shù)組進(jìn)行修改
但是可以自己通過數(shù)組索引來修改原來的數(shù)組
3.2 forEach()
不能遍歷對(duì)象,可以使用for in
4.1 您不能使用break語句中斷循環(huán),也不能使用return語句返回到外層函數(shù)
4.2 ES5推出的,實(shí)際性能比for還弱
5.1 通過數(shù)組索引改變?cè)瓟?shù)組
var obj = [1,2,3,4,5,6]var res = obj.forEach(function(item, index, arr) { arr[index] = item * 10;})console.log(res); // --> undefinedconsole.log(obj); // --> [10,20,30,40,50,60]
5.2 如果數(shù)組在迭代的時(shí)候被修改,則當(dāng)前元素與前面的元素會(huì)跳過。因?yàn)?code>forEach()不會(huì)在迭代之前創(chuàng)建數(shù)組的副本
var words = ['1', '2', '3', '4'];words.forEach(function(word) { console.log(word); if (word === '2') { words.shift(); }});// 1// 2// 4
6.1 $.each
與 for in
可遍歷數(shù)組,可遍歷對(duì)象
6.1.1遍歷數(shù)組
var arr = [1,2,3,4,5]var res = $.each(arr, function(index, value){ console.log(index, value);})console.log(res); // 返回值,被遍歷的函數(shù)
6.1.2遍歷對(duì)象
var obj = {name: "psg", age: 22, gender: "male"};// for in 遍歷for(var key in obj) { console.log(key, obj[key]);}// $.each 遍歷$.each(obj, function(key, value) { console.log(key, value);})
filter()
方法是對(duì)原數(shù)組進(jìn)行過濾篩選,產(chǎn)生一個(gè)新的數(shù)組對(duì)象
2.1 filter()
不會(huì)對(duì)空數(shù)組進(jìn)行檢測(cè)(如果對(duì)空數(shù)組進(jìn)行篩選,返回值位undefined)
2.2 filter()
不會(huì)改變?cè)紨?shù)組
2.3 返回?cái)?shù)組,包含了符合條件的所有元素。如果沒有符合條件的元素則返回空數(shù)組
forEach方法中的function回調(diào)有三個(gè)參數(shù),
[].filter(function(value, index, array), thisValue)
4.1 在一個(gè)Array中,刪除偶數(shù),只保留奇數(shù)
var arr = [1, 2, 3, 4, 5, 6, 9, 10, 15];var r = arr.filter(function(x) { return x % 2 !== 0;});r; // [1,3,5,9,15]
4.2 把一個(gè)Array中的空字符串刪掉
var arr = ['A', '', 'B', null, undefined, 'C', ' '];var r = arr.filter(function(e) { return s && s.trim(); // 注意:IE9一下的版本沒有trim()方法});r; // ['A', 'B', 'C']
4.3 巧妙去除Array的重復(fù)元素
var r, arr = ['A', 'B', 'C', 'D', 'B', 'A']r = arr.filter(function(e, i, self) { return self.indexOf === i;})console.log(r); // --> ['A', 'B', 'C', 'D']
4.4 篩選素?cái)?shù)
function get_primes(arr) { var i; return arr.filter(function (element) { var flag = true; if (element < 2) { flag = false; } else { for (var i = 2; i < element; i++) { if (element % i == 0) { flag = false; break; } } } return flag; })}
參考:
http://www.survivalescaperooms.com/article/157032.htm
http://www.survivalescaperooms.com/article/157040.htm
http://www.survivalescaperooms.com/article/157052.htm
http://www.survivalescaperooms.com/article/157053.htm
感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運(yùn)行工具:http://tools.VeVB.COm/code/HtmlJsRun測(cè)試上述代碼運(yùn)行效果。
PS:這里再為大家推薦一款JS數(shù)組遍歷方式分析對(duì)比工具供大家參考:
在線JS常見遍歷方式性能分析比較工具:http://tools.VeVB.COm/aideddesign/js_bianli
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《JavaScript數(shù)組操作技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》、《javascript面向?qū)ο笕腴T教程》、《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》及《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注