相信大家都用慣了jquery或者underscore等這些類庫中常用的數組相關的操作,如$.isArray,_.some,_.find等等方法。這里無非是對原生js的數組操作多了一些包裝。
這里主要匯總一下JavaScript數組操作的常用API。相信對大家解決程序問題很有幫助。
一、性質
JavaScript中的數組是一種特殊的對象,用來表示偏移量的索引是該對象的屬性,索引可能是整數。然而,這些數字索引在內部被轉換為字符串類型,這是因為JavaScript對象中的屬性名必須是字符串。
二、操作
1 判斷數組類型
var array0 = []; // 字面量 var array1 = new Array(); // 構造器 // 注意:在IE6/7/8下是不支持Array.isArray方法的 alert(Array.isArray(array0)); // 考慮兼容性,可使用 alert(array1 instanceof Array); // 或者 alert(Object.prototype.toString.call(array1) === '[object Array]');
2 數組與字符串
非常簡單:由數組轉換為字符串,使用join;由字符串轉換為數組,使用split。
// join - 由數組轉換為字符串,使用join console.log(['Hello', 'World'].join(',')); // Hello,World // split - 由字符串轉換為數組,使用split console.log('Hello World'.split(' ')); // ["Hello", "World"]
3 查找元素
相信大家都常用字符串類型indexOf,卻很少知道數組的indexOf同樣可以用于查找元素。
// indexOf - 查找元素 console.log(['abc', 'bcd', 'cde'].indexOf('bcd')); // 1 // var objInArray = [ { name: 'king', pass: '123' }, { name: 'king1', pass: '234' } ]; console.log(objInArray.indexOf({ name: 'king', pass: '123' })); // -1 var elementOfArray = objInArray[0]; console.log(objInArray.indexOf(elementOfArray)); // 0
從以上可以看出,對于數組包含對象的這種數組,indexOf方法并非是經過深度比較來得到對應的查找結果,僅僅是比較對應元素的引用。
4 數組連接
使用concat,要注意,使用concat之后會生成一個新的數組。
var array1 = [1, 2, 3]; var array2 = [4, 5, 6]; var array3 = array1.concat(array2); // 實現數組連接之后,會創建出新的數組 console.log(array3);
5 類列表操作
用于添加元素,可分別使用push和unshift,移除元素可分別使用pop和shift。
// push/pop/shift/unshift var array = [2, 3, 4, 5]; // 添加到數組尾部 array.push(6); console.log(array); // [2, 3, 4, 5, 6] // 添加到數組頭部 array.unshift(1); console.log(array); // [1, 2, 3, 4, 5, 6] // 移除最后一個元素 var elementOfPop = array.pop(); console.log(elementOfPop); // 6 console.log(array); // [1, 2, 3, 4, 5] // 移除第一個元素 var elementOfShift = array.shift(); console.log(elementOfShift); // 1 console.log(array); // [2, 3, 4, 5]
6 splice方法
主要兩個用途:
① 從數組中間位置添加和刪除元素
② 從原有數組中,獲取一個新數組
當然,兩個用途是一氣合成的,有些場景注重用途一,有些則注重用途二。
從數組中間位置添加和刪除元素,splice方法為數組添加元素,需提供如下參數
① 起始索引(也就是你希望開始添加元素的地方)
②
需要刪除的元素的個數或者是提取的元素的個數(添加元素時該參數設置為0)
③ 想要添加進數組的元素
var nums = [1, 2, 3, 7, 8, 9]; nums.splice(3, 0, 4, 5, 6); console.log(nums); // [1, 2, 3, 4, 5, 6, 7, 8, 9] // 緊接著做刪除操作或者提取新的數組 var newnums = nums.splice(3, 4); console.log(nums); // [1, 2, 3, 8, 9] console.log(newnums); // [4, 5, 6, 7]
7 排序
主要介紹reverse和sort兩個方法。數組反轉使用reverse,sort方法不僅可以用于簡單排序,也可以用于復雜排序。
// 反轉數組 var array = [1, 2, 3, 4, 5]; array.reverse(); console.log(array); // [5, 4, 3, 2, 1] 我們先對字符串元素的數組進行排序 var arrayOfNames = ["David", "Mike", "Cynthia", "Clayton", "Bryan", "Raymond"]; arrayOfNames.sort(); console.log(arrayOfNames); // ["Bryan", "Clayton", "Cynthia", "David", "Mike", "Raymond"]
我們對數字元素的數組進行排序
// 如果數組元素時數字類型,sort()方法的排序結果就不能讓人滿意了 var nums = [3, 1, 2, 100, 4, 200]; nums.sort(); console.log(nums); // [1, 100, 2, 200, 3, 4]
sort方法是按照字典順序對元素進行排序的,因此它假定元素都是字符串類型,因此,即使元素是數字類型,也被認為是字符串類型。這時,可以在調用方法時傳入一個大小比較函數,排序時,sort()方法將會根據該函數比較數組中兩個元素的大小,從而決定整個數組的順序。
var compare = function(num1, num2) { return num1 > num2; }; nums.sort(compare); console.log(nums); // [1, 2, 3, 4, 100, 200] var objInArray = [ { name: 'king', pass: '123', index: 2 }, { name: 'king1', pass: '234', index: 1 } ]; // 對數組中的對象元素,根據index進行升序 var compare = function(o1, o2) { return o1.index > o2.index; }; objInArray.sort(compare); console.log(objInArray[0].index < objInArray[1].index); // true
8 迭代器方法
主要包含forEach和every、some和map、filter
forEach相信大家都會,主要介紹一下其他四種方法。
every方法接受一個返回值為布爾類型的函數,對數組中的每個元素使用該函數。如果對于所有的元素,該函數均返回true,則該方法返回true。
var nums = [2, 4, 6, 8]; // 不生成新數組的迭代器方法 var isEven = function(num) { return num % 2 === 0; }; // 如果都是偶數,才返回true console.log(nums.every(isEven)); // true some方法也接受一個返回值為布爾類型的函數,只要有一個元素使得該函數返回true,該方法就返回true。 var isEven = function(num) { return num % 2 === 0; }; var nums1 = [1, 2, 3, 4]; console.log(nums1.some(isEven)); // true
map和filter這兩個方法都可以產生新數組,map返回的新數組是對原有元素應用某個函數得到的結果。如:
var up = function(grade) { return grade += 5; } var grades = [72, 65, 81, 92, 85]; var newGrades = grades.ma
filter方法和every方法很類似,傳入一個返回值為布爾類型的函數。和every()方法不同的是,當對數組中的所有元素應用該函數,結果均為true時,該方法并不返回true,而是返回一個新數組,該數組包含應用該函數后結果為true的元素。
var isEven = function(num) { return num % 2 === 0; }; var isOdd = function(num) { return num % 2 !== 0; }; var nums = []; for (var i = 0; i < 20; i++) { nums[i] = i + 1; } var evens = nums.filter(isEven); console.log(evens); // [2, 4, 6, 8, 10, 12, 14, 16, 18, 20] var odds = nums.filter(isOdd); console.log(odds); // [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
三、總結
以上還存在某些方法在低級瀏覽器不支持的問題,還需要再采用其他方法進行兼容實現。
這些都是常見的可能大家不太容易想到的方法。大家不妨多留意一下。
希望本文所述對大家的javascript程序設計有所幫助。
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com