第 2 章 數(shù)組
1. 創(chuàng)建和初始化數(shù)組
var arr = new Array();
var arr = new Array(7);
var arr = new Array('aa','bb');
或:
var arr = [];
var arr = ['aa','bb'];
arr.length //數(shù)組長(zhǎng)度
訪問元素和迭代數(shù)組
for(var i=0;i<arr.length;i++){
console.log(arr[i]);
}
2. 添加元素
var arr = [1,2,3];
arr[arr.length] = 4;
2.1 使用 push 方法(添加到數(shù)組末尾)
arr.push(5);
arr.push(6,7);
2.2 使用 unshift 方法(插入元素到數(shù)組首位)
arr.unshift(0);
arr.unshift(-2,-1);
原理:
for (var i=arr.length; i>=0; i--){
arr[i] = arr[i-1];
}
arr[0] = 0;
3. 刪除元素
3.1 使用 pop 方法(刪除數(shù)組里最靠后的元素)
arr.pop();
3.2 使用 shift 方法(從數(shù)組首位刪除元素)
arr.shift();
原理:
for (var i = 0; i < arr.length; i++){
arr[i] = arr[i+1];
}
4. 在任意位置添加或刪除元素
使用 splice 方法(通過指定位置/索引添加或刪除相應(yīng)位置和數(shù)量的元素)
arr.splice(1,2); // 從數(shù)組索引1開始刪除2個(gè)元素
arr.splice(1,0,7,8,9); // 從數(shù)組索引1開始添加3個(gè)元素
arr.splice(1,2,7,8,9);//從數(shù)組索引1開始刪除2個(gè)元素,并從索引1開始添加3個(gè)元素
5. 二維和多維數(shù)組
function printArr(matrix){
for(var i=0;i<matrix.length;i++){
for(var j=0;j<matrix[i].length;j++){
console.log(matrix[i][j])
}
}
}
3×3×3:
for (var i=0; i<arr.length; i++){
for (var j=0; j<arr[i].length; j++){
for (var z=0; z<arr[i][j].length; z++){
console.log(arr[i][j][z]);
}
}
}
6. Javascript 數(shù)組方法參考
方法名 | 描述 |
---|---|
concat | 連接2個(gè)或更多數(shù)組假消,并返回結(jié)果 |
every | 對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),如果該函數(shù)對(duì)每一項(xiàng)都返回 true 撞蚕,則返回 true |
filter | 對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù)扬虚,返回該函數(shù)會(huì)返回 true 的項(xiàng)組成的數(shù)組 |
forEach | 對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù)串前。這個(gè)方法沒有返回值 |
join | 將所有的數(shù)組元素連接成一個(gè)字符串 |
indexOf | 返回第一個(gè)與給定參數(shù)相等的數(shù)組元素的索引熊杨,沒有找到則返回-1 |
lastIndexOf | 返回在數(shù)組中搜索到的與給定參數(shù)相等的元素的索引里最大的值 |
map | 對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù)费韭,返回每次函數(shù)調(diào)用的結(jié)果組成的數(shù)組 |
reverse | 顛倒數(shù)組中元素的順序依沮,原先第一個(gè)元素現(xiàn)在變成最后一個(gè)涯贞,同樣原先的最后一個(gè)元素變成了現(xiàn)在的第一個(gè) |
slice | 傳入索引值,將數(shù)組里對(duì)應(yīng)索引范圍內(nèi)的元素作為新數(shù)組返回 |
some | 對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù)危喉,如果任一項(xiàng)返回 true 宋渔,則返回 true |
sort | 按照字母順序?qū)?shù)組排序,支持傳入指定排序方法的函數(shù)作為參數(shù) |
toString | 將數(shù)組作為字符串返回 |
valueOf | 和 toString 類似辜限,將數(shù)組作為字符串返回 |
6.1 數(shù)組合并 (concat)
var num = 0;
var arr1 = [1,2,3];
var arr2 = [-3,-2,-1];
var nums = arr2.concat(num,arr2);//[-3,-2,-1,0,1,2,3]
6.2 迭代器函數(shù)
var isEven = function(x){
console.log(x)
return (x % 2 == 0);
};
var nums = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];
1. 用 every 方法迭代( every 方法會(huì)迭代數(shù)組中的每個(gè)元素皇拣,直到返回 false )
nums.every(isEven); //1
2. 用 some 方法迭代( some 方法會(huì)迭代數(shù)組的每個(gè)元素,直到函數(shù)返回 true)
nums.some(isEven);//1,2
3. 用 forEach 方法迭代(迭代整個(gè)數(shù)組薄嫡,與for循環(huán)相同)
nums.forEach(isEven);
4. 使用 map 和 filter 方法
var myMap = nums.map(isEven);// [false, true, false, true, false, true, false, true,false, true, false, true, false, true, false]
var myFilter = nums.filter(isEven);//[2, 4, 6, 8, 10, 12, 14]
5. 使用 reduce 方法
nums.reduce(function(preVal,currVal,index,arr){
return preVal + currVal;
});//120
6.3 ECMAScript 6 和數(shù)組的新功能
方 法 | 描 述 |
---|---|
@@iterator | 返回一個(gè)包含數(shù)組鍵值對(duì)的迭代器對(duì)象氧急,可以通過同步調(diào)用得到數(shù)組元素的鍵值對(duì) |
copyWithin | 復(fù)制數(shù)組中一系列元素到同一數(shù)組指定的起始位置 |
entries | 返回包含數(shù)組所有鍵值對(duì)的 @@iterator |
includes | 如果數(shù)組中存在某個(gè)元素則返回 true ,否則返回 false 岂座。ES7新增 |
find | 根據(jù)回調(diào)函數(shù)給定的條件從數(shù)組中查找元素态蒂,如果找到則返回該元素 |
findIndex | 根據(jù)回調(diào)函數(shù)給定的條件從數(shù)組中查找元素,如果找到則返回該元素在數(shù)組中的索引 |
fill | 用靜態(tài)值填充數(shù)組 |
from | 根據(jù)已有數(shù)組創(chuàng)建一個(gè)新數(shù)組 |
keys | 返回包含數(shù)組所有索引的 @@iterator |
of | 根據(jù)傳入的參數(shù)創(chuàng)建一個(gè)新數(shù)組 |
values | 返回包含數(shù)組中所有值的 @@iterator |
ES6和ES7新增的數(shù)組方法费什。
方 法 | 描 述 |
---|---|
@@iterator | 返回一個(gè)包含數(shù)組鍵值對(duì)的迭代器對(duì)象钾恢,可以通過同步調(diào)用得到數(shù)組元素的鍵值對(duì) |
copyWithin | 復(fù)制數(shù)組中一系列元素到同一數(shù)組指定的起始位置 |
entries | 返回包含數(shù)組所有鍵值對(duì)的 @@iterator |
includes | 如果數(shù)組中存在某個(gè)元素則返回 true 手素,否則返回 false 。ES7新增 |
find | 根據(jù)回調(diào)函數(shù)給定的條件從數(shù)組中查找元素瘩蚪,如果找到則返回該元素 |
findIndex | 根據(jù)回調(diào)函數(shù)給定的條件從數(shù)組中查找元素泉懦,如果找到則返回該元素在數(shù)組中的索引 |
fill | 用靜態(tài)值填充數(shù)組 |
from | 根據(jù)已有數(shù)組創(chuàng)建一個(gè)新數(shù)組 |
keys | 返回包含數(shù)組所有索引的 @@iterator |
of | 根據(jù)傳入的參數(shù)創(chuàng)建一個(gè)新數(shù)組 |
values | 返回包含數(shù)組中所有值的 @@iterator |
6.3.1 使用 forEach 和箭頭函數(shù)迭
nums.forEach(function(x){
console.log(x%2==0);
});
num.forEach(x => {console.log(x%2==0)})
6.3.2 使用 for...of 循環(huán)迭代
for(let n of nums){ //n 代表數(shù)組中每一項(xiàng)
console.log((n%2==0)?'even':'odd');
}
6.3.3 使用ES6新的迭代器( @@iterator )
ES6還為 Array 類增加了一個(gè) @@iterator 屬性,需要通過 Symbol.iterator 來訪問疹瘦。
let iterator = nums[Symbol.iterator]();
console.log(iterator.next().value); // 1
console.log(iterator.next().value); // 2
console.log(iterator.next().value); // 3
console.log(iterator.next().value); // 4
console.log(iterator.next().value); // 5
數(shù)組的 entries 崩哩、 keys 和 values 方法
1. entries 方法返回包含鍵值對(duì)的 @@iterator
let aEntries = nums.entries(); // 得到鍵值對(duì)的迭代器
console.log(aEntries.next().value); // [0, 1] - 位置0的值為1
console.log(aEntries.next().value); // [1, 2] - 位置1的值為2
console.log(aEntries.next().value); // [2, 3] - 位置2的值為3
2. keys 方法返回包含數(shù)組索引的 @@iterator
let aKeys = nums.keys(); // 得到數(shù)組索引的迭代器
console.log(aKeys.next()); // {value: 0, done: false }
console.log(aKeys.next()); // {value: 1, done: false }
console.log(aKeys.next()); // {value: 2, done: false }
3. values 方法返回的 @@iterator 則包含數(shù)組的值
let aValues = nums.values();
console.log(aValues.next()); // {value: 1, done: false }
console.log(aValues.next()); // {value: 2, done: false }
console.log(aValues.next()); // {value: 3, done: false }
6.3.4 使用 from 方法(根據(jù)已有的數(shù)組創(chuàng)建一個(gè)新數(shù)組)
let nums2 = Array.from(nums);
let evens = Array.from(nums,x => {x%2==0});
6.3.5 使用 Array.of 方法(根據(jù)傳入的參數(shù)創(chuàng)建一個(gè)新數(shù)組)
let num3 = Array.of(1);
let num4 = Array.of(1, 2, 3, 4, 5, 6);
等價(jià)于:
let num3 = [1];
let num4 = [1, 2, 3, 4, 5, 6];
復(fù)制已有數(shù)組:
let numCopy = Array.of(...num4);
6.3.6 使用 fill 方法(用靜態(tài)值填充數(shù)組。參數(shù):填充數(shù)言沐、開始索引邓嘹、結(jié)束索引)
let numCopy = Array.of(1, 2, 3, 4, 5, 6);
numCopy.fill(0); // [0,0,0,0,0,0]
numCopy.fill(2, 1); // [0,2,2,2,2,2]
numCopy.fill(1, 3, 5); // [0,2,2,1,1,2]
let ones = Array(6).fill(1);// [1,1,1,1,1,1]
6.3.7 使用 copyWithin 方法(復(fù)制數(shù)組中的一系列元素到同一數(shù)組指定的起始位置)
let copyArray = [1, 2, 3, 4, 5, 6];
copyArray.copyWithin(0, 3); // [4, 5, 6, 4, 5, 6]
copyArray = [1, 2, 3, 4, 5, 6];
copyArray.copyWithin(1, 3, 5);// [1, 4, 5, 4, 5, 6]
6.4 排序元素
nums = [1,2,3,4,5,6,7,8,9,10]
nums.reverse();//[10,9,8,7,6,5,4,3,2,1]
nums.sort(function(a, b){
return a-b;
});
等價(jià)于:
function compare(a, b) {
if (a < b) {
return -1;
}
if (a > b) {
return 1;
}
return 0;
}
nums.sort(compare);
6.4.1 自定義排序
var friends = [
{name:'張三',age:18},
{name:'李四',age:25},
{name:'王五',age:21}
]
function comparePerson(a, b){
if (a.age < b.age){
return -1
}
if (a.age > b.age){
return 1
}
return 0;
}
console.log(friends.sort(comparePerson));//從小到大
6.4.2 字符串排序
var names =['Ana', 'ana', 'john', 'John'];
names.sort(function(a, b){
if (a.toLowerCase() < b.toLowerCase()){
return -1
}
if (a.toLowerCase() > b.toLowerCase()){
return 1
}
return 0;
});
對(duì)帶有重音符號(hào)的字符做排序
var names2 = ['Maève', 'Maeve'];
console.log(names2.sort(function(a, b){
return a.localCompare(b);
}));
6.5 搜索
indexOf 方法返回與參數(shù)匹配的第一個(gè)元素的索引, lastIndexOf 返回
與參數(shù)匹配的最后一個(gè)元素的索引
6.5.1 ECMAScript 6—— find 和 findIndex 方法
let nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
function multipleOf13(element, index, array) {
return (element % 13 == 0) ? true : false;
}
console.log(nums.find(multipleOf13)); //找到返回13险胰,找不到返回undefined
console.log(nums.findIndex(multipleOf13)); //找到返回索引汹押,找不到返回-1
6.5.2 ECMAScript 7——使用 includes 方法
數(shù)組里存在某個(gè)元素, includes 方法會(huì)返回 true 起便,否則返回 false 棚贾。
console.log(nums.includes(15));
console.log(nums.includes(20));
let nums2 = [7, 6, 5, 4, 3, 2, 1];
console.log(nums2.includes(4, 5));//從索引5開始查找
6.6 輸出數(shù)組為字符串
把數(shù)組里所有元素輸出為一個(gè)字符串,可以用 toString 方法
console.log(nums.toString());
用一個(gè)不同的分隔符(比如 - )把元素隔開榆综,可以用 join 方法
var numsString = nums.join('-');
console.log(numsString);
6.7 類型數(shù)組
類型數(shù)組 | 數(shù)據(jù)類型 |
---|---|
Int8Array | 8位二進(jìn)制補(bǔ)碼整數(shù) |
Uint8Array | 8位無符號(hào)整數(shù) |
Uint8ClampedArray | 8位無符號(hào)整數(shù) |
Int16Array | 16位二進(jìn)制補(bǔ)碼整數(shù) |
Uint16Array | 16位無符號(hào)整數(shù) |
Int32Array | 32位二進(jìn)制補(bǔ)碼整數(shù) |
Uint32Array | 32位無符號(hào)整數(shù) |
Float32Array | 32位IEEE浮點(diǎn)數(shù) |
Float64Array | 64位IEEE浮點(diǎn)數(shù) |
類型數(shù)組則用于存儲(chǔ)單一類型的數(shù)據(jù)
類型數(shù)組 | 數(shù)據(jù)類型 |
---|---|
Int8Array | 8位二進(jìn)制補(bǔ)碼整數(shù) |
Uint8Array | 8位無符號(hào)整數(shù) |
Uint8ClampedArray | 8位無符號(hào)整數(shù) |
Int16Array | 16位二進(jìn)制補(bǔ)碼整數(shù) |
Uint16Array | 16位無符號(hào)整數(shù) |
Int32Array | 32位二進(jìn)制補(bǔ)碼整數(shù) |
Uint32Array | 32位無符號(hào)整數(shù) |
Float32Array | 32位IEEE浮點(diǎn)數(shù) |
Float64Array | 64位IEEE浮點(diǎn)數(shù) |
let length = 5;
let int16 = new Int16Array(length);
let array16 = [];
array16.length = length;
for (let i=0; i<length; i++){
int16[i] = i+1;
}
console.log(int16);