數組是JavaScript中最常用的數據類型之一,為此Array對象中提供了許多內置方法,如棧方法、檢索方法、數組轉字符串的方法等。本節將針對數組的常用方法進行詳細講解。
JavaScript中,除了前面講解的添加與刪除數組元素的方式外,還可以利用Array對象提供的棧方法實現在數組的末尾或開頭添加數組的新元素,也稱為入棧;在數組的末尾或開頭刪除數組元素,也稱為出棧。具體如表3-1所示。
表3-1中需要注意的是,push()和unshift()方法的返回值是新數組的長度,而pop()和shift()方法返回的是移出的數組元素。
為了更好地理解數組元素棧方法的使用,接下來通過案例3-6進行演示?!纠?-6】demo06.html
<script>
var arr = ['Rose', 'Lily'];
console.log('原數組:' + arr);
var last = arr.pop();
console.log('在末尾移出元素:' + last + ' -移出后數組:' + arr);
var len = arr.push('Tulip', 'Jasmine');
console.log('在末尾添加元素后長度變為:' + len + ' -添加后數組:' + arr);
var first = arr.shift();
console.log('在開頭移出元素:' + first+ ' -移出后數組:' + arr);
len = arr.unshift('Balsam', 'sunflower');
console.log('在開頭添加元素后長度變為:' + len + ' -添加后數組:' + arr);
</script>
從上述代碼可以看出,push()和unshift()方法可以為指定數組在末尾或開頭添加一個或多個元素,而pop()和shift()方法則只能移出并返回指定數組在末尾或開頭的一個元素。輸出結果如圖3-12所示。
在開發中,若要檢測給定的值是否是數組,或是查找指定的元素在數組中的位置,則可以利用Array對象提供的檢索方法,具體如表3-2所示。
表3-2中除了Array.isArray()方法外,其余方法默認都是從指定數組索引的位置開始檢索,并且檢索方式與運算符“===”相同,即只有全等時才會返回比較成功的結果。為了初學者更好的理解這些方法的使用,下面通過代碼和案例進行演示。
var data = ['peach', 'pear', 26, '26','grape'];
// 從數組下標為3的位置開始檢索數字26
console.log(data.includes(26,3)); // 輸出結果:false
// 從數組下標為data.length -3 的位置查找數字26
console.log(data.includes(26, -3)); // 輸出結果:true
// 判斷變量data是否為數組
console.log(Array.isArray(data)); // 輸出結果:true
在上述代碼中,includes()方法在使用時,第1個參數表示待查找的值,第2個參數用于指定在數組中查找的索引下標,當其值大于數組長度時,數組不會被檢索,直接返回false;若將下標設置為小于0的數時,則檢索的下標位置等于數組長度加上指定的負數,若結果仍是小于0的數,則檢索整個數組。
indexOf()用于在數組中從指定下標位置,檢索到的第一個給定值,存在則返回對應的元素下標,否則返回-1。下面以判斷一個元素是否在指定數組中,若不在則更新數組為例進行講解。如例3-7所示。【例3-7】demo07.html
<script>
var arr = ['potato', 'tomato', 'chillies', 'green-pepper'];
var search = 'cucumber';
if (arr.indexOf(search) === -1) { // 查找的元素不存在
arr.push(search);
console.log('更新后的數組為: ' + arr);
} else if (arr.indexOf(search) > -1) { // 防止返回的下標為0,if判斷為false
console.log(search + '元素已在arr數組中。');
}
</script>
上述第2行代碼用于創建待檢索的數組arr,第3行利用search變量保存需要檢索的值,第4~9行代碼用于檢索arr數組中是否含有search元素,若沒有則執行第5~6行代碼,在arr數組末尾添加該元素,效果如圖3-13左側所示;若有則執行第8行代碼,在控制臺輸出對應的提示信息,如將search的值設置為tomato時,效果如圖3-13右側所示。
圖3-13indexOf()方法示例
值得一提的是,indexOf()方法的第2個參數用于指定開始查找的下標,當其值大于或等于數組長度時,程序不會在數組中查找,直接返回-1;當其值為負數時,查找的下標位置等于數組長度加上指定的負數,若結果仍是小于0的數,則檢索整個數組。
Array對象提供的lastIndexOf()方法,用于在數組中從指定下標位置檢索到的最后一個給定值的下標。與indexOf()檢索方式不同的是,lastIndexOf()方法默認逆向檢索,即從數組的末尾向數組的開頭檢索。接下來以找出指定元素出現的所有位置為例進行講解。如例3-8所示。【例3-8】demo08.html
<script>
var res = [];
var arr = ['a', 'b', 'a', 'c', 'a', 'd'];// 待檢索的數組
var search= 'a';// 要查找的數組元素
var i = arr.lastIndexOf(search);
while (i !==-1) {
res.push(i);
i = (i > 0 ? arr.lastIndexOf(search, i -1): -1);
}
console.log('元素' + search + ' 在數組中的所有位置為:' + res);
</script>
上述第2行初始化的res變量,用于保存指定元素出現的所有索引下標。第5行用于獲取arr數組中search變量最后一次出現的位置,第6~9行通過循環獲取search變量出現的所有位置。其中,第7行用于從res數組的末尾添加找到的元素下標,第8行通過判斷當前的下標是否大于0,確定arr中是否還有元素,若結果為true,則下標值i減1,繼續從指定位置向前檢索變量search的值最后一次出現的下標,直到檢索完數組,將i設置為-1結束循環。輸出結果如圖3-14所示。
圖3-14lastIndexOf()方法的示例
值得一提的是,lastIndexOf()方法的第2個參數用于指定查找的下標,且由于其采用逆向的方式檢索,因此當其值大于或等于數組長度時,則整個數組都會被查找。當其值為負數時,則索引位置等于數組長度加上給定的負數,若其值仍為負數,則直接返回-1。
在項目開發中,若需要將數組轉換為字符串,則可以利用JavaScript提供的join()和toString()方法實現。具體如表3-3所示。
表3-3數組轉字符串
為了讓大家更加清楚的了解數組轉字符串的使用,下面通過示例的方式演示。
console.log(['a','b','c'].join()); // 輸出結果:a,b,c
console.log([[4,5],[1,2]].join('-')); // 輸出結果:4,5-1,2
console.log(['a','b','c'].toString());// 輸出結果:a,b,c
console.log([[4,5],[1,2]].toString());// 輸出結果:4,5,1,2
從上述代碼可知,join()和toString()方法可將多維數組轉為字符串,默認情況下使用逗號連接。不同的是,join()方法可以指定連接數組元素的符號。另外,當數組元素為undefined、null或空數組時,對應的元素會被轉換為空字符串。
除了前面講解的幾種常用方法外,JavaScript還提供了很多其他常用的數組方法。例如,合并數組、數組淺拷貝、顛倒數組元素的順序等。具體如表3-4所示。
表3-4其他方法
表3-4中的slice()和concat()方法在執行后返回一個新的數組,不會對原數組產生影響,剩余的方法在執行后皆會原數組產生影響。
接下來,以splice()方法為例演示如何在指定位置添加或刪除數組元素。如例3-9所示。
【例3-9】demo09.html
<script>
var arr = ['sky', 'wind', 'snow', 'sun'];
// 從數組下標2的位置開始,刪除2個元素4arr.splice(2, 2);5console.log(arr);
// 從數組下標1的位置開始,刪除1個元素后,再添加snow元素
arr.splice(1, 1, 'snow');
console.log(arr);
// 指定下標4大于數組的長度,則直接在數組末尾添加hail和sun元素
arr.splice(4, 0, 'hail', 'sun');
console.log(arr);
// 從數組下標3的位置開始,添加數組、null、undefined和空數組
arr.splice(3, 0, ['lala', 'yaya'], null, undefined, []);
console.log(arr);
</script>
在上述代碼中,splice()方法的第1個參數用于指定添加或刪除的下標位置;第2個參數用于從指定下標位置開始,刪除數組元素的個數,將其設置為0,則表示該方法只添加元素。剩余的參數表示要添加的數組元素,若省略則表示刪除元素。效果如圖3-15所示。
圖3-15splice()方法添加或刪除數組元素
值得一提的是,splice()方法的第1個參數的值等于或大于數組長度時,從數組末尾開始操作;當該值為負數時,則下標位置等于數組長度加上指定的負數,若其值仍為負數,則從數組的開頭開始操作。