Array 陣列
Array 是最簡單也最被廣泛使用的資料結構,幾乎所有程式語言都具備陣列這個資料結構,
以定義來說,他是由相同類型的元素(element)的集合所組成的資料結構,在一般程式語言中陣列只能儲存同樣型別的值,但在 JavaScript 則可以儲存不同型別的值(也應該盡量避免)。
優點:
lookup: 只需要利用 index 即可對特定位置的資料作存取與查詢,此動作之時間複雜度為 O(1)push: 資料到最尾端時也只要時間複雜度 O(1)
缺點:
insert、 delete: Array 的元素在記憶體中是連續儲存的,所以假設要新增或刪除 Array 的第1個位置的元素,則須將第2~last 位置的元素一一往前或往後搬動,時間複雜度為 O(n)
使用時機 :
希望能夠快速存取查詢資料,時間複雜度只有
O(1)。已知欲處理的資料數量,便能確認 Array 的大小。
#在 JavaScript 中的 Array 是 Dynamic Array,動態分配陣列大小可能會導致搬移O(n)要求記憶體空間的使用越少越好。
Javascript 陣列:
建立 class
1 | class MyArray { |
get
1 | class MyArray { |
push
1 | class MyArray { |
pop
1 | class MyArray { |
delete
1 | class MyArray { |
shift
1 | class MyArray { |
陣列在 JavaScript 上內建的方法
新增陣列
使用
new Array(),可以自定陣列大小1
2
3let newArr1 = new Array();
let newArr2 = new Array(999);
let students = new Array('阿諾史瓦辛格', '席維斯史特龍');使用
[]宣告陣列1
2let newArr1 = [];
let students = ['阿諾史瓦辛格', '席維斯史特龍'];
push 、 pop 、 unshift 、 shift
使用
push、pop新增或移除最後陣列元素:1
2
3
4
5
6
7let students = ['阿諾史瓦辛格', '席維斯史特龍', '馮迪索'];
// 將 巨石強森 加入最後元素
students.push('巨石強森'); // ['阿諾史瓦辛格', '席維斯史特龍', '馮迪索', '巨石強森']
// 將剛剛加入的 巨石強森 移除
students.pop(); // ['阿諾史瓦辛格', '席維斯史特龍', '馮迪索']將元素插入陣列首位 和 移除首位的元素
unshift、shift:1
2
3
4
5
6
7let students = ['阿諾史瓦辛格', '席維斯史特龍', '馮迪索'];
// 將 巨石強森 插入首位
students.unshift('巨石強森'); // ['巨石強森', '阿諾史瓦辛格', '席維斯史特龍', '馮迪索']
// 將剛剛加入的 巨石強森 移除
students.shift(); // ['阿諾史瓦辛格', '席維斯史特龍', '馮迪索']
二維陣列
在 JavaScript 中只其實只支援一維陣列,但是可以用陣列嵌套陣列的方式來模擬多維陣列:
1 | let students = []; |
常用陣列方法
陣列迭代
forEach,單純對陣列每個元素都進行迭代1
2
3numbers.forEach(function(value, index){
console.log(value, index);
});map,對陣列每個元素都進行迭代並回傳新的陣列,不會改變原本陣列。1
2
3
4
5
6
7let numbers = [1, 2, 3, 4];
let newNumbers = numbers.map(function(value, index) {
return value + 1
});
console.log(numbers); // [1, 2, 3, 4]
console.log(newNumbers); // [2, 3, 4, 5]every,對陣列每個元素都進行迭代,若迭代函數內容皆為 true,則回傳 true,反之回傳 false1
2
3
4
5
6
7let ages = [32, 33, 16, 40];
function checkAdult(age) {
return (age >= 18) ? true : false;
}
console.log(ages.every(checkAdult)); // falsesome,若迭代函數中有一個為 true 即回傳 true,反之回傳 false1
2
3
4
5
6
7let ages = [3, 10, 18, 20];
function checkAdult(age) {
return (age >= 18) ? true : false;
}
console.log(ages.some(checkAdult)); // truereduce,由左向右累加,參數有四個previousValue,currentValue,index,array1
2
3
4
5
6let numbers = [2, 3, 5, 6];
function getSum(total, num) {
return total + num;
}
console.log(numbers.reduce(getSum)); // 16reduceRight,由右向左累加1
2
3
4
5
6let numbers = [2, 3, 5, 6];
function getSum(total, num) {
return total + num;
}
console.log(numbers.reduce(getSum)); // 16filter,依據條件回傳過濾後的陣列1
2
3
4
5
6
7let ages = [32, 33, 16, 40];
function checkAdult(age) {
return age >= 18;
}
console.log(ages.filter(checkAdult)); // [32, 33, 40]
搜尋
indexOf,搜尋第一個匹配到的元素的index1
2let students = ['阿諾史瓦辛格', '席維斯史特龍', '馮迪索', '巨石強森'];
let a = students.indexOf('馮迪索'); // 2lastIndexOf,搜尋最後一個匹配到的元素的index1
2let students = ['阿諾史瓦辛格', '席維斯史特龍', '馮迪索', '巨石強森','馮迪索'];
let a = students.indexOf("Orange"); // 4
排序
sort,將陣列內容進行排序,回傳排序後陣列,若為文字則根據 ASCII Code 編碼大小進行比較1
2let fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort(); // ["Apple", "Banana", "Mango", "Orange"]reverse,將陣列內容反轉1
2let fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.reverse(); // ["Mango", "Apple", "Orange", "Banana"]
陣列合併和切割
join,將陣列轉成字串,預設以分隔符號,串連成字串1
2
3
4
5let fruits = ['Banana', 'Orange', 'Lemon', 'Apple', 'Raspberry'];
console.log(fruits.join()); // Banana,Orange,Lemon,Apple,Raspberry
let fruits = ['Banana', 'Orange', 'Lemon', 'Apple', 'Raspberry'];
console.log(fruits.join('')); // BananaOrangeLemonAppleRaspberrytoString,回傳陣列轉成字串的結果,不會改變原本陣列,類似join,但是只能用預設,做分隔1
2let fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.toString(); // Banana,Orange,Apple,Mangosplit,將字串轉成陣列1
2let a = '1,2,3,4';
console.log(a.split(',')); //["1", "2", "3", "4"]concat,合併陣列1
2
3let hege = ["Cecilie", "Leo"];
let stale = ["Emil", "May", "Linus"];
console.log(hege.concat(stale)); // ['Cecilie', 'Leo', 'Emil', 'May', 'Linus']slice,剪裁並回傳新的陣列1
2let fruits = ['Banana', 'Orange', 'Lemon', 'Apple', 'Raspberry'];
console.log(fruits.slice(1, 3)); // ['Orange', 'Lemon', 'Apple']

Comments