作者根據JavaScript紅皮書,結合簡單的測試,比較全面的總結了JavaScript中Array(數組)類型的相關知識。 ...
創建數組
var colors = new Array(); //創建新數組 var num = new Array(3); //創建包含三項的新數組 var names = new Array("Dalu"); // 創建包含一項數據“Dalu”的新數組
檢測數據類型是否為數組
if(Array.isArray(value)){ // ECMAscript5新增 // 是數組 }; if(value instanceof Array){ // 是數組 }
轉換數組為String類型四種方法
toString():由數組中每個值的字元串形式拼接而成的一個以逗號分隔的字元串。
valueOf():同上。
toLocaleString():和toString()返回結果基本相同,調用的是每一項的toLocale- String()方法。
join():可自定義分隔符
代碼示例:
var nums = [1,2,3]; alert(nums.toString()); // ”1,2,3” alert(nums.join(’||’); // “1||2||3”
* 如果數組中的某一項的值是null或者undefined,那麼該值在上述方法返回的結果中以空字元串表示。
數組排序
棧和隊列
push():在數組最後插入數據,可以是一個或多個。
pop():獲取數組最後一項的值。
shift():移除數組中的第一個項並返回該項 ,同時將數組長度減 1 。
unshift():在數組前端添加任意個項並返回新數組的長度 。同時使用unshift()和pop()方法,可以從相反的方向來模擬隊列,即在數組的前端添加項,從數組末端移除項。
重排序
reverse():反轉數組項的順序。
sort():調用每個數組項的toString()轉型方法,然後比較得到的字元串,以確定如何排序。即使數組中的每一項都是數值,sort()方法比較的也是字元串。sort()方法可以接收一個比較函數作為參數,以便我們指定哪個值位於哪個值的前面。
代碼示例:
// 棧方法
var colors = new Array(); var count = colors.push("red","green"); //在最後面推入兩項 console.log(colors); //["red","green"] console.log(count); //計數為2 count = colors.push("black"); //在最後面推入另一項 console.log(count); //3 var item = colors.shift(); //移除數組中的第一個項並返回該項 console.log(item); //"red" console.log(colors.length); //2
// 隊列方法 var colors = new Array(); var count = colors.unshift("red","green"); //在最前面推入兩項 console.log(count); //2 count = colors.unshift("black"); //在最前面推入另一項 console.log(count); //3 var item = colors.pop(); //移除數組中的最後一項並返回該項 console.log(item); //"green" console.log(corlors.length); //2
// reverse() 反轉數組項的順序 var values = [1,2,3,4,5]; values.reverse(); console.log(values); // [5,4,3,2,1]
// sort() 調用每個數組項的toString()轉型方法,然後比較得到的字元串,以確定如何排序
var values = [0,1,5,10,15]; values.sort(); console.log(values); // [0,1,10,15,5] // sort()方法可以接收一個比較函數作為參數,以便我們指定哪個值位於哪個值的前面。 /* 比較函數接收兩個參數,如果第一個參數應該位於第二個之前則返回一個負數,如果兩個參數相等則返回0,如果第一個參數應該位於第二個之後則返回一個正數。以下就是一個簡單的比較函數:*/
// 升序 function compare(value1,value2){ if(value1 < value2){ return -1; } else if(value1 > value2){ return 1; } else { return 0; } } var values = [0,1,5,10,15]; values.sort(compare); console.log(values); // [0,1,5,10,15] // 降序 function compare(value1,value2){ if(value1 < value2){ return 1; } else if(value1 > value2){ return -1; } else { return 0; } } var values = [0,1,5,10,15]; values.sort(compare); console.log(values); // [15,10,5,1,0] /*對於數值類型或者其valueOf()方法會返回數值類型的對象類型,可以使用一個更簡單的比較函數。這個函數只要用第二個值減第一個值即可*/ function compare(value1,value2){ return value2 - value1; }
操作方法
• concat():基於當前數組中的所有項創建一個新數組 。
具體來說 ,這個方法會先創建當前數組一個副本 ,然後將接收到的參數添加到這個副本的末尾 ,最後返回新構建的數組 。在沒有給 c o n c a t ( )方法傳遞參數的情況下 ,它只是複製當前數組並返回副本 。如果傳遞給 c o n c a t ( )方法的是一或多個數組 ,則該方法會將這些數組中的每一項都添加到結果數組中 。如果傳遞的值不是數組 ,這些值就會被簡單地添加到結果數組的末尾 。
• slice():基於當前數組中的一或多個項創建一個新數組 。
如果 s l i c e ( )方法的參數中有一個負數 ,則用數組長度加上該數來確定相應的位置 。例如 ,在一個包含 5項的數組上調用 s l i c e ( 2 , 1 )與調用 s l i c e ( 3 , 4 )得到的結果相同 。如果結束位置小於起始位置 ,則返回空數組 。
• splice():向數組的中部插入項,但使用這種方法的方式則有如下3種
刪除:可以刪除任意數量的項,只需指定2個參數:要刪除的第一項的位置和要刪除的項數。例如,splice(0,2)會刪除數組中的前兩項。
插入:可以向指定位置插入任意數量的項,只需提供3個參數:起始位置、0(要刪除的項數)和要插入的項。如果要插入多個項,可以再傳入第四、第五,以至任意多個項。例如,splice(2,0,"red","green")會從當前數組的位置2開始插入字元串"red"和"green"。
替換:可以向指定位置插入任意數量的項,且同時刪除任意數量的項,只需指定3個參數:起始位置、要刪除的項數和要插入的任意數量的項。插入的項數不必與刪除的項數相等。例如,splice(2,1,"red","green")會刪除當前數組位置2的項,然後再從位置2開始插入字元串"red"和"green"。
代碼示例:
// concat()
var colors = ["red","green","blue"]; var colors2 = colors.concat("yellow",["black","brown"]); console.log("colors"); //["red","green","blue"] console.log("colors2"); //["red","green","blue","yellow","black","brown"]
// slice()
var colors = ["red","green","blue","yellow","purole"]; var colors2 = colors.slice(1); var colors3 = colors.slice(1,4); console.log(colors2) //["green","blue","yellow","purole"] console.log(colors3) //["green","blue","yellow"]
// splice() var colors = ["red","green","blue"]; var removed = colors.splice(0,1); // 刪除第一項 console.log(colors); //["green","blue"] console.log(removed); //["red"],返回的數組只包含一項 removed = colors.splice(1,0,"yellow","orange"); //從位置1開始插入兩項 console.log(colors); //["green","yellow","orange","blue"] console.log(removed); //返回一個空數組[] removed = colors.splice(1,2,"red","purple"); //插入兩項,刪除兩項 console.log(colors); //["green","red","purple","blue"] console.log(removed); //["yellow","orange"],返回類型為Array,包含兩項
位置方法
indexOf():從數組的開頭 (位置 0 )開始向後查找
lastIndexOf():從數組的末尾開始向前查找 。
這兩個方法都接收兩個參數 :要查找的項和 (可選的 )表示查找起點位置的索引 。
這兩個方法都返回要查找的項在數組中的位置 ,或者在沒找到的情況下返回-1 。在比較第一個參數與數組中的每一項時 ,會使用全等操作符 ;
支持它們的瀏覽器包括IE9+、Firefox2+、Safari3+、Opera9.5+和Chrome。
代碼示例:
// indexOf() var numbers = [1,2,3,4,5,4,3,2,1]; console.log(numbers.indexOf(4)); //3 console.log(numbers.lastIndexOf(4)); //5 console.log(numbers.indexOf(4,4)); //5 console.log(numbers.lastIndexOf(4,4)) //3 var person = {name:"Dalu"}; var people = [{name:"Dalu"}]; var morePeople = [person]; console.log(people.indexOf(person)); //-1 console.log(morePeople.indexOf(person)); //0
迭代方法
every():對數組中的每一項運行給定函數,如果該函數對每一項都返回ture,則返回ture。
filter():對數組中的每一項運行給定函數,返回該函數會返回ture的項組成的數組 。
forEach():對數組中的每一項運行給定函數。這個方法沒有返回值 。
map():對數組中的每一項運行給定函數,返回每次函數調用的結果組成的數組 。
some():對數組中的每一項運行給定函數,如果該函數對任一項返回ture ,則返回ture。
支持這些迭代方法的瀏覽器有IE9+、Firefox2+、Safari3+、Opera9.5+和Chrome。
代碼示例:
// every() var numbers = [1,2,3,4,5,4,3,2,1]; var everyResult = numbers.every(function(item,index,array){ return (item > 2); }); console.log(everyResult); //false var someResult = numbers.some(function(item,index,array){ return (item > 2); }); console.log(someResult); //ture
// filter() var numbers = [1,2,3,4,5,4,3,2,1]; var filterResult = numbers.filter(function(item,index,array){ return (item > 2); }); console.log(filterResult); //[3,4,5,4,3]
// map() var numbers = [1,2,3,4,5,4,3,2,1]; var mapResult = numbers.map(function(item,index,array){ return item * 2; }); console.log(mapResult); //[2,4,6,8,10,8,6,4,2]
// forEach() var numbers = [1,2,3,4,5,4,3,2,1]; numbers.forEach(function(item,index,array){ console.log("item:" + item) //返回當前項的值 console.log("index:" + index) //返回當前項的索引 console.log("array:" + array) //返回數組的字元串1,2,3,4,5,4,3,2,1 });
縮小方法
reduce():迭代數組的所有項 ,然後構建一個最終返回的值 。正序。
reduceRight():迭代數組的所有項 ,然後構建一個最終返回的值 。倒序。
這兩個方法都接收兩個參數:一個在每一項上調用的函數和(可選的)作為縮小基礎的初始值。傳給reduce()和reduceRight()的函數接收4個參數:前一個值、當前值、項的索引和數組對象。這個函數返回的任何值都會作為第一個參數自動傳給下一項。第一次迭代發生在數組的第二項上,因此第一個參數是數組的第一項,第二個參數就是數組的第二項。
代碼示例:
// reduce() var values = [1,2,3,4,5]; var sum = values.reduce(function(prev,cur,index,array){ return prev + cur; }); console.log(sum); //15
// reduceRight() 倒序 var value = [1,2,3,4,5]; var sum = values.reduceRight(function(prev,cur,index,array){ return prve + cur; }); console.log(sum); //15 由於都是累計相加,所以結果一樣