1. 程式人生 > >js 陣列基本知識及常見操作

js 陣列基本知識及常見操作

開發中對於陣列的操作有很多,今天就說說一些常用的對陣列的操作。

陣列是指有序的集合,裡面的每個值叫做元素,每個元素在陣列中都會有自己的腳標(index)。js中的陣列是弱型別,陣列中的元素可以是不同的型別,甚至可以是物件和其他的陣列。

陣列的建立

陣列的建立可以有以下幾種方式:

var arr_1 = [];
  var arr_2 = new Array();
  var arr_3 = new Array(length);
  var arr_4 = new Array([ele0 [,ele1 [,ele2 [, ...[, eleN]]]]]);

被建立的 arr_1 和 arr_2 都是長度為0的陣列;arr_3 建立時傳入了長度length,所以長度就是length;arr_4 的長度取決於建立時傳入的引數個數。

這裡特別說一下 arr_3 的建立,arr_3 還可以被叫做稀疏陣列,稀疏陣列指的是並不含有從0開始連續索引的陣列,其長度 length 一般都比陣列的元素個數大。

舉個例子:

var arr = new Array(1); // arr 並不存在下標為0的元素。
  console.log(arr[0]); // undefined


  // 稀疏陣列還可以動態改變陣列的長度 length
  arr.length = 2; // 但並不存在 0 ~ 1 de 索引
  console.log(arr.length); // 2

  // 給陣列賦值,但這裡又有兩種情況,賦值的腳標 index 小於等於 length-1 和大於 length-1
  arr[0] = 1; // 腳標 index 小於等於 length-1
  console.log("arr 長度:" + arr.length); // arr 長度:2

  arr[4] = 2; // 腳標 index 大於 length-1
console.log("arr 長度:" + arr.length); // arr 長度:5
  // 所以當腳標 index 大於 length-1 時,陣列的長度 length 也會被重新改變,即 length = index + 1

 // 遍歷稀疏陣列用 for...in ,只輸出賦值了元素,不會輸出所有元素
  for(var i in arr){
console.log(arr[i]); // 1 2
  }

  // 如果用 for 迴圈,沒有被賦值的元素會輸出 undefined
 for(var = 0; i< arr.length; i++){
console.log(i); // 1 undefined undefined undefined 2
 }

  // 順便提一下,用 (,) 留空的方式建立的陣列也是稀疏陣列

總結一下上面提到的:
  1、稀疏陣列的長度 length 一般都會比陣列的元素個數大,並且陣列的長度 length 可以動態改變;
  2、給指定腳標 index 賦值時,當腳標 index 小於等於陣列長度 length-1 時,陣列長度不會改變;當腳標 index 大於陣列長度 length 時,陣列的長度 length 會改變,即 length = index + 1;
  3、稀疏陣列遍歷一般用 in 操作符,只會輸出被賦值了的元素

陣列的操作
 首先說一下原生js的陣列操作,主要有以下一些:

1、push([ele0 [,ele1 [,...[,eleN]]]]) 在陣列的末尾新增一個或多個元素,並返回新陣列的長度;
 2、unshift([ele0 [,ele1 [,...[,eleN]]]]) 在陣列的前面新增一個或多個元素,並返回新陣列的長度;
 3、pop() 刪除陣列最後一個元素,並返回被刪除的元素;
 4、shift() 刪除陣列第一個元素,並返回被刪除的元素;
 5、slice(startIndex, [endIndex]) 以腳標 startIndex 開始,endIndex 結束,複製原陣列中的元素,但不包括 endIndex 對應的元素;如果無 endIndex,則複製 startIndex 以後的所有元素,並返回一個新陣列;
  6、concat([item0 [,item1 [,... [, itemN]]]]) 將多個數組(也可以是字串,或者是陣列和字串的混合)連線為一個數組,返回連線好的新陣列;如果沒有引數,就返回一個與原陣列一樣元素的新陣列
 7、splice(startIndex, deleteNum, [insertItem0 [,insertItem1 [,... [, insertItemN]]]]) 從腳標 startIndex(包括startIndex) 開始,刪除 deleteNum 個元素,並將一個或者多個 insertItem(insertItem 可以是字串,或者是陣列和字串的混合) 插入 startIndex 的位置;以陣列的形式返回被刪除的元素
 8、sort(function(a, b){ return a - b}) 將陣列進行排序,傳入的函式為排序函式,a-b 為升序排列,b-a 為降序排列,返回一個排序後的新陣列
 9、reverse() 將陣列元素反轉,並返回一個新的陣列
  10、join(item) 將陣列轉換成字串,沒有元素之間被 item 隔開

例子:
 1、在元素的末尾/首位新增若干元素,且原陣列保持不變
 function insertToArr(arr){
 if(!(arr instanceof Array)){
/* 傳入的不是陣列物件 */
return;
 }
// var arr_1 = arr.slice(0); // 淺複製原陣列
var arr_1 = arr.concat(); // 淺複製原陣列
arr_1.unshift("aa", "bb"); // 在首位新增 "aa" "bb"
arr_1.push("a", "b"); // 在末尾新增 "a" "b"
return arr_1;
 }

 2、刪除陣列的第一個元素/最後一個元素,且原陣列保持不變
 function deleteForArr(arr){
if(!(arr instanceof Array)){
/* 傳入的不是陣列物件 */
return;
 }
// var arr_1 = arr.slice(0); // 淺複製原陣列
var arr_1 = arr.concat(); // 淺複製原陣列
arr_1.pop(); // 刪除陣列的最後一個元素
arr_1.shift(); // 刪除陣列的第一個元素
return arr_1;
 }
 3、刪除陣列指定位子指定個數的元素,並新增新的元素進去,且原陣列保持不變
 function updateForArr(arr){
if(!(arr instanceof Array)){
/* 傳入的不是陣列物件 */
return;
 }
// var arr_1 = arr.slice(0); // 淺複製原陣列
var arr_1 = arr.concat(); // 淺複製原陣列
//arr_1.splice(1, 1); // 從腳標1開始(包括腳標1),刪除一個元素
//arr_1.splice(1, 1, "a"); // 從腳標1開始(包括腳標1),刪除一個元素,並將元素 "a" 新增到腳標1位子
arr_1.splice(1, 1, "a", "b"); // 從腳標1開始(包括腳標1),刪除一個元素,並將元素 "a" 和 "b" 依次新增到腳標1位子
return arr_1;
 }

4、將陣列升序排列/降序排列,且原陣列保持不變
 // 升序排列
 function ascendForArr(arr){
 if(!(arr instanceof Array)){
/* 傳入的不是陣列物件 */
return;
 }
// var arr_1 = arr.slice(0); // 淺複製原陣列
var arr_1 = arr.concat(); // 淺複製原陣列
// 升序排列
arr_1.sort(function(item1, item2){
return item1 - item2;
})
return arr_1;
 }
 // 降序排列
 function ascendForArr(arr){
 if(!(arr instanceof Array)){
/* 傳入的不是陣列物件 */
return;
 }
// var arr_1 = arr.slice(0); // 淺複製原陣列
var arr_1 = arr.concat(); // 淺複製原陣列
// 降序排列
arr_1.sort(function(item1, item2){
return item2 - item1;
})
return arr_1;
 }

jquery 中對陣列的一些常用操作:
 1、$.esch(arr, function(index, value){}) 遍歷陣列;回撥函式的第一個引數為索引,第二個引數為元素值;若需要結束遍歷,在回撥函式中呼叫 return false;
 2、$.grep(arr, function(value, index, [boolean]){}) 過濾陣列;回撥函式的第一個引數為元素值,第二個引數為元素索引;函式第三個引數為 boolean 值,false 就返回滿足回撥函式表示式的值,true 就取反滿足回撥函式表示式的值;並返回一個新的陣列;
 3、$.map(arr, function(value){}) 按給定條件轉換陣列;回撥函式的第一個引數為元素值;它可以根據特定條件,更新陣列元素值,或根據原值擴充套件一個新的副本元素;並返回一個新的陣列;
 4、$.inArray(val, arr) 判斷 val 是否存在 arr 中;如果在,則返回在陣列中的索引值;如果不在,則返回 -1;
 5、$.isArray(arr) 判斷 arr 是不是一個數組;是則返回 true ,不是 則返回 false;
 6、$.merge(arr1, arr2) 將陣列 arr1 與陣列 arr2 合併,並返回一個新的陣列
 7、$.unique(arr) 過濾陣列中重複元素,並返回一個新的陣列

 例子:
 1、遍歷陣列,當 index === 2 時結束遍歷
 function ergodicArr(arr){
 // 判斷 arr 是否為一個數組
 if(!$.isArray(arr)){
 /* 傳入的不是陣列物件 */
return;
 }
$.each(arr, function(i, v){
console.log("index=" + i,"value=" + v);
if(i === 2){
return false;
}
});
 }

 2、 操作 arr 陣列,返回一個滿足 index > 2 的新陣列 / 返回一個除去滿足 index > 2 的新陣列
 function operationArr(arr){
 // 判斷 arr 是否為一個數組
 if(!$.isArray(arr)){
 /* 傳入的不是陣列物件 */
return;
 }
 // 滿足 index > 2
var arr_ 1 = $.grep(arr, function(v, i){
return i > 2;
}, false);
// 除去滿足 index > 2 剩下的元素組成的陣列
var arr_ 2 = $.grep(arr, function(v, i){
return i > 2;
}, true);
 }

 3、合併陣列 arr_1 和 arr_2,並返回一個新的陣列
 function mergeArr(arr_1, arr_2){
for(var i in arguments){
if(!$.isArray(arguments[i])){
/* "傳入的第" + (parseInt(i) + 1) + "引數不是陣列" */
return;
}
}
var newArr = $.merge(arr_1, arr_2);
return newArr;
 }

 4、過濾陣列中的重複元素
 function filterDb(arr){
 if(!$.isArray(arr)){
 /* 傳入的不是陣列物件 */
return;
 }
var arr_1 = $.unique(arr);
return arr_1;
 }

es6 中對陣列的一些常用操作:
 1、indexOf(searchVal, startIndex) 從 startIndex 位置開始檢索陣列中是否存在 searchVal,有則返回相應腳標,沒有則返回 -1;
 2、lastIndexOf(searchVal, lastStartIndex) 從 lastStartIndex 位置往回開始檢索陣列中是否存在 searchVal,有則返回相應腳標,沒有則返回 -1;與indexOf(searchVal, startIndex) 相反;
 3、includes(searchElement, fromIndex) 判斷一個數組是否包含一個指定的值,返回 true 或 false。searchElement:要查詢的元素;fromIndex:開始查詢的索引位置;
 4、map(function(v, i, arr){}) 按給定條件轉換陣列,且必須有返回值,如果沒有,就返回 undefined;
 5、filter(function(v){}) 過濾篩選;按照給定條件篩選出資料,必須有返回值,否則返回空;
 6、reduce(function(first, second){}) 對陣列中的所有元素呼叫指定的回撥函式。該回調函式的返回值為累積結果,並且此返回值在下一次呼叫該回調函式時作為引數提供;
 7、Array.isArray(arr) 判斷 arr 是否為一個數組,返回 true 或 false
 8、Array.prototype.slice.call 將類似陣列的物件(比如arguments)轉換為真實的陣列

 例子:
 1、查詢每個元素是都在陣列中
 function seekData(arr){
if(!Array.isArray(arr)){
/* 傳入的不是陣列物件 */
return;
}
var index = arr.indexOf(1); // 判斷數字1是都存在於陣列 arr 中
return index > -1 ? "數字1在arr的第" + (index + 1) + "位" : "數字1不在arr中";
 }
 2、只返回陣列中是數字的元素
 function filterNum(arr){
if(!Array.isArray(arr)){
/* 傳入的不是陣列物件 */
return;
}
var arr_1 = arr.filter(function(v){
return typeof v === "number";
});
return arr_1;
 }

3、返回陣列中數字的總和
 function sumForArr(arr){
if(!Array.isArray(arr)){
/* 傳入的不是陣列物件 */
return;
}
// 過濾數字
var arr_1 = arr.filter(function(v){
return typeof v === "number";
});
// 求和
var sum = arr_1.reduce(function(v1, v2){
return v1 + v2;
});
return sum;
 }

好了,這裡就不再繼續贅述,以上就是一些陣列常見的操作,當然還有一些沒有提到,有興趣的童鞋可以自己再去深入地學習一下。
 說了這麼多,希望對大家有用。