前面一篇,我們寫了數組的基礎,在這里則會把主要的方法和應用列出來.
檢測數組 Array.isArrayECMAScript 5 新增了 Array.isArray() 方法。這個方法的目的是最終確定某 個值到底是不是數組,而不管它是在哪個全局執行環境中創建的。這個方法的用法如下。 if (Array.isArray(value)){ //對數組執行某些操作 }
位置方法 indexOf和lastIndexOf
- indexOf(searchvalue,fromindex) 從數組的頭開始向后查找
- indexOf和lastIndexOf(searchvalue,fromindex) 從數組的尾開始向前查找
接收兩個參數:- searchvalue 要查找的項
- fromindex (可選的)表示查找起點位置的索引
返回 要查找的項在數組中的位置,或者在沒找到的情況下返回-1
var data = [2, 5, 7, 3, 5]; console.log(data.indexOf(5, "x")); // 1 ("x"被忽略) console.log(data.indexOf(5, "3")); // 4 (從3號位開始搜索) console.log(data.indexOf(4)); // -1 (未找到) console.log(data.indexOf("5")); // -1 (未找到,因為5 !== "5")
迭代方法共有五個迭代方法every, filter, forEach, map, some 每個方法的的參數是一個回調函數 迭代方法(function callback(item,index,array) {}); 回調函數都是三個參數- item 數組的元素
- index 元素在數組中的位置
- array 數組對象本身
同時,有必要的回調函數要返回true或false
- every :對數組中的每一項運行給定函數,如果該函數對每一項都返回 true ,則返回 true 。相當于是每項做與操作
- filter :對數組中的每一項運行給定函數,返回該函數會返回 true 的項組成的數組。
- forEach :對數組中的每一項運行給定函數。這個方法沒有返回值。
- map :對數組中的每一項運行給定函數,返回每次函數調用的結果組成的數組。
- some :對數組中的每一項運行給定函數,如果該函數對任一項返回 true ,則返回 true 。相當于是每項做或操作
let a = [1,2,3,99,34,33]; let v1 = a.every((item,index,array)=>{ return item > 2; }); //v1的值為false 因為a[0],a[1]不合條件 let v2 = a.every((item,index,array)=>{ return item > 0; }); //v2的值為true
let a = [1,2,3,99,34,33]; let v = a.filter((item,index,array)=>{ return item > 2; }); //v是過濾后的新數組 [3,99,34,33]
a.forEach((item)=>{ console.log(item); }); //會依次打印出每個元素的值 a.forEach((item,index)=>{ console.log(index,item); }); //會依次打印出每個元素的下標和值
let a = [1,2,3,99,34,33]; let v = a.map((item,index,array)=>{ return item * item; }); //v是map后的新數組 [1,4,9,9801,1156,1089]
let a = [1,2,3,99,34,33]; let v1 = a.some((item,index,array)=>{ return item > 2; }); //v1的值為true 因為a[2],a[3]等元素值>2 let v2 = a.some((item,index,array)=>{ return item > 100; }); //v2的值為false ,因為沒有元素值大于100
歸并方法
- reduce 從左到右累加
- reduceRight 從右到左累加
這兩個方法,都會遍歷所有數組元素 參數是一個回調函數 歸并方法 (function callback(prev, cur, index, array){});- prev 前一個值
- cur 當前元素
- index 該元素在數組中的位置
array 數組對象本身 例子
let a = [1,2,3,99,34,33]; let s = a.reduce((pre,cur,index,array)=>{ console.log(pre,cur,index); return pre+cur; });
//1 2 1t REPLServer.<anonymous> (repl.js:538:10) //3 3 2t emitOne (events.js:101:20) //6 99 3 REPLServer.emit (events.js:188:7) //105 34 4 //139 33 5
數組棧方法數組可以像棧那樣使用 push方法,表示在數組最后加入指定的元素,可以一次增加多個數組 pop方法,表示將數組的最后一個刪除,并通過pop方法返回,如果沒有元素了,則返回undefined a.push(100); a.push(99);
console.log(a.pop()); console.log(a.pop());
結果輸出 99 100 隊列方法數組可以像隊列那樣使用 用push方法,在隊尾加元素 用shift在隊頭取元素 用unshift在隊頭推入元素 let a=[]; a.push(1,2,3); Console.log(a.shift()); Console.log(a.shift()); Console.log(a.shift());
然后顯示為1,2,3剛好和棧相反 let a = [1,2,3]; a.unshift(4); a.unshift(5,6,7);
結果a為[ 5, 6, 7, 4, 1, 2, 3 ] let a = [1,2,3,4,5]; a.reverse()
結果: [ 5, 4, 3, 2, 1 ] function compare(v1,v2) { return v1>v2; } // a.sort();默認將元素用toString,再比較字符串排序 let a=[2,22,222,1,11,111]; let v1 = a.sort(); //則v1=[1,11,111,2,22, 222] //**這是不是按數值大小來排序,是按字會串大小來的**
//可以指定的比較方法a.sort(compare); //則結果如下: let v2 = a.sort(compare); //則v2 = [ 1, 2, 11, 22, 111, 222 ]
連接數組用concat可以將一個或多數組連起來,并不會改變當前數組本身 a = [1,2,3]; b = a.concat(99); //b=[1,2,3,99]; B = a.concat(99,[4,5]); //b=[1,2,3,99,4,5];
基于原有數組創建新數組用slice基于當前數組中的一或多個項創建一個新數組,原數組不會變 slice(開始下標,結束下標) ; 并不包括結束下標的那個元素 let a = [1,2,3,4,5,6]; b=a.slice(2,4); //b=[3,4];
強大的splice這個方法恐怕要算是最強大的數組方法了 splice的返回值,則操作后的元素組成的數組 可以刪除任意數量的元素,只需指定 2個參數:- startIndex 開始刪除的位置
- removeCount 要刪除的元素個數。
例如, a.splice(0,2) 會刪除數組中的前兩元素。
let a = [1,2,3,4,5,6]; let b = a.splice(1,2); //執行后,結果是 //a = [ 1, 4, 5, 6 ] //b = [ 2, 3 ]
可以向指定位置插入任意數量的元素,只需提供 3個參數:- 起始位置、
- 0(要刪除的元素個數,做為插入功能,這值必須為0)
- 要插入的元素
- 如果要插入多個元素,
還可以繼續提供參數,表示是要插入的元素。 例如,
let a = [1,2,3,4,5,6]; let b = a.splice(1,0,91,92,93,94); //執行后結果是 //a = [ 1, 91, 92, 93, 94, 2, 3, 4, 5, 6 ] //b = [ ]
可以向指定位置插入任意數量的元素,且同時刪除任意數量的元素,只需指定 3 個參數:- 起始位置、
- >0的值(要刪除的元素個數,做為替換功能,這值必須大于0)
- 要插入的元素
- 如果要插入多個元素,
還可以繼續提供參數,表示是要插入的元素。
let a = [1,2,3,4,5,6]; let b = a.splice(1,2,91,92,93,94); //執行后結果是 //a = [ 1, 91, 92, 93, 94, 4, 5, 6 ] //b = [ 2, 3 ]
最后對于迭代方法和歸并方法只是一個簡化代碼的作用,可能這些方法功能非常見,所以干脆默認提從了這兩組方法。對于js的數組,使用起來非常方法,相比c/c++真是無與倫比…。在C++11標準后,也可以同樣提供一個強大的動態數組。但是js的數組,可以存放任何元素,這個是C++不能比的,雖然可以實現,但是代價就有點大了。相對來說,現在版本的java和C#,則可以。因為java所有的都是Object…
|