摘要:方法,還有一個特性,當缺省或是為,和方法一樣,通常我用對數組的每個元素進行一定操作映射后,會返回一個新的數組該方法對數組中的每一項運行給定函數。
1. 前言
ES5中新增的一些處理數組(Array)的方法, 對于用JavaScript處理數據非常有用。我總結了一下,給這些方法分了類,大體如下:
2個索引方法:indexOf() 和 lastIndexOf();
5個迭代方法:forEach()、map()、filter()、some()、every();
2個歸并方法:reduce()、reduceRight();
下面我們來具體看一看這些方法怎么用吧!
2、索引方法索引方法包含indexOf()和lastIndexOf()兩個方法,這兩個方法都接收兩個參數,第一個參數是要查找的項,第二個參數是查找起點位置的索引,該參數可選,如果缺省或是格式不正確,那么默認為0。兩個方法都返回查找項在數組中的位置,如果沒有找到,那么返回-1。區別就是一個從前往后找,一個從后往前找。
讓我們來看一個具體列子吧,首先定義一個數組:
var dataArray = [1, 7, 5, 7, 1, 3]; indexOf():該方法從數組的開頭開始向后查找。 console.log(dataArray.indexOf(7)); // 1 缺省, 從第一項開始查找 lastIndexOf(): 該方法從數組的末尾開始向前查找。 console.log(dataArray.lastIndexOf (7)); // 3 缺省, 從末尾第一項開始查找
值得注意的是,在比較第一個參數與數組中的每一項時,會使用全等操作符, 要求必須完全相等,否則返回-1。
console.log(dataArray .lastIndexOf ("7")); // -1,因為這里是字符串,并不是數值類型三、迭代方法
迭代方法包含some()、every()、filter()、map()和forEach()五個方法,這些方法都接收兩個參數,第一個參數是一個函數,他接收三個參數,數組當前項的值、當前項在數組中的索引、數組對象本身。第二個參數是執行第一個函數參數的作用域對象,也就是上面說的函數中this所指向的值。注意,這幾種方法都不會改變原數組。
every()和 some() 方法有些類似,我們放在一起比較。
every(): 該方法對數組中的每一項運行給定函數,如果該函數對每一項都返回 true,則返回true。
some(): 該方法對數組中的每一項運行給定函數,如果該函數對任何一項返回 true,則返回true。
var arr = [ 1, 2, 3, 4, 5, 6 ]; console.log( arr.some( function( item, index, array ){ console.log( "item=" + item + ",index="+index+",array="+array ); return item > 3; })); console.log( arr.every( function( item, index, array ){ console.log( "item=" + item + ",index="+index+",array="+array ); return item > 3; }));
可以看到,some方法是碰到一個返回true的值時候就返回了,并沒有繼續往下運行,而every也一樣,第一個值就是一個false,所以后面也沒有進行下去的必要了,就直接返回結果了
filter() : 該方法對數組中的每一項運行給定函數,返回該函數會返回 true 的項組成的數組。利用這個方法可對數組元素進行過濾篩選。
var arr = [ {"name":"apple", "count": 2}, {"name":"orange", "count": 5}, {"name":"pear", "count": 3}, {"name":"orange", "count": 5}, ]; var newArr = arr.filter(function(item){ return item.name === "orange"; }); console.log("Filter results:",newArr); [{"name":"orange", "count": 5},{"name":"orange", "count": 5}]
grep(array, function[, invert])方法,還有一個特性,當invert缺省或是為false,和filter方法一樣,通常我用filter
map(): 對數組的每個元素進行一定操作(映射)后,會返回一個新的數組
var oldArr = [{first_name:"Colin",last_name:"Toh"},{first_name:"Addy",last_name:"Osmani"},{first_name:"Yehuda",last_name:"Katz"}]; ? function getNewArr(){ ????? ??return oldArr.map(function(item,index){ ????item.full_name = [item.first_name,item.last_name].join(" "); ????return item; ??}); ??? } ? console.log(getNewArr()); ------------- {first_name: "Colin", last_name: "Toh", full_name: "Colin Toh"} {first_name: "Addy", last_name: "Osmani", full_name: "Addy Osmani"} {first_name: "Yehuda", last_name: "Katz", full_name: "Yehuda Katz"}
forEach(): 該方法對數組中的每一項運行給定函數。這個方法沒有返回值。這個方法其實就是遍歷循環,和for循環沒有太大差別。jquery()也提供了相應的方法each()方法。
var arr = [1,2,3,4,5,6,7,8]; // Uses the usual "for" loop to iterate for(var i= 0, l = arr.length; i< l; i++){ console.log(arr[i]); } console.log("========================"); //Uses forEach to iterate arr.forEach(function(item,index){ console.log(item); });四、歸并方法
歸并方法包含reduce()和reduceRight()兩個方法,這兩個方法都會迭代數組中的所有項,然后生成一個最終返回值。他們都接收兩個參數,第一個參數是每一項調用的函數,函數接受是個參數分別是初始值,當前值,索引值,和當前數組,函數需要返回一個值,這個值會在下一次迭代中作為初始值。第二個參數是迭代初始值,參數可選,如果缺省,初始值為數組第一項,從數組第一個項開始疊加,缺省參數要比正常傳值少一次運算。
reduce():該方法從數組的第一項開始,逐個遍歷到最后一項。
用for循環來寫 var arr = ["apple","orange","apple","orange","pear","orange"]; function getWordCnt(){ var obj = {}; for(var i= 0, l = arr.length; i< l; i++){ var item = arr[i]; obj[item] = (obj[item] +1 ) || 1; } return obj; } console.log(getWordCnt());應用reduce
var arr = ["apple","orange","apple","orange","pear","orange"]; function getWordCnt(){ return arr.reduce(function(prev,next){ prev[next] = (prev[next] + 1) || 1; return prev; },{}); } console.log(getWordCnt());reduce 傳入。reduce(callback, initialValue)會傳入兩個變量。回調函數(callback)和初始值(initialValue)。假設函數它有個傳入參數,prev和next,index和array。prev和next你是必須要了解的。
一般來講prev是從數組中第一個元素開始的,next是第二個元素。但是當你傳入初始值(initialValue)后,第一個prev將是initivalValue,next將是數組中的第一個元素。
var arr = ["apple","orange"]; function noPassValue(){ return arr.reduce(function(prev,next){ console.log("prev:",prev); console.log("next:",next); return prev + " " +next; }); } function passValue(){ return arr.reduce(function(prev,next){ console.log("prev:",prev); console.log("next:",next); prev[next] = 1; return prev; },{}); } console.log("No Additional parameter:",noPassValue()); console.log("----------------"); console.log("With {} as an additional parameter:",passValue());
顧名思義,reduceRight()就是最后一位往前面算,就不詳細說了。
五、兼容性問題ES5里這些處理數組的新方法,在IE6-IE8瀏覽器還未得到支持,所以我們需要在IE這些低版本瀏覽器中引入這個es5-shim補丁,這樣我們就可以使用它了。
補丁地址:https://github.com/es-shims/e...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/82566.html
摘要:正文和中新增的的數組迭代方法如下其中,是新增的,其余都是新增的。指數組后,返回過濾后的新數組。它的參數跟方法是一樣的所有數組成員依次執行回調函數,直到找出第一個返回值為的成員,然后返回該成員。 前言 ES5和ES6中新增了不少東西,對于數組而言,新增了不少迭代方法,讓我們可以拋棄for循環,更方便的寫JS代碼。 正文 ES5和ES6中新增的的數組迭代方法如下: forEach map...
摘要:再將其返回,注意是返回一個新的數組,而不是將原數組直接改變使用方式和類似也是接受一個回調函數,一個改變內部指向的對象。 前言 一直以來想寫一篇關于es5中新增數組的使用方法與源碼實現的文章,拖了挺久了,趁著這夜深人靜,大腦清醒,又困意不在的時刻寫下來。也許有人會問,現如今es6都大行其道了,還學es5是不是有些過時了,?,溫故而知新,可以從中多學點嘛,而且我們是要自己實現這些方法,知其...
摘要:需要返回值,如果不給,默認返回使用場景假定有一個數值數組將數組中的值以雙倍的形式放到數組寫法方法使用場景假定有一個對象數組將數中對象某個屬性的值存儲到數組中三從數組中找出所有符合指定條件的元素檢測數值元素,并返回符合條件所有元素的數組。 showImg(https://segmentfault.com/img/remote/1460000016810336?w=1149&h=524);...
閱讀 3339·2022-01-04 14:20
閱讀 3108·2021-09-22 15:08
閱讀 2188·2021-09-03 10:44
閱讀 2316·2019-08-30 15:44
閱讀 1491·2019-08-29 18:40
閱讀 2655·2019-08-29 17:09
閱讀 2989·2019-08-26 13:53
閱讀 3222·2019-08-26 13:37