数组
创建及初始化
let daysOfWeek = new Array();
daysOfWeek = new Array(7);
daysOfWeek = new Array('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri','Sat');
daysOfWeek = [];
daysOfWeek = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
- 访问元素和迭代元素
for (let i = 0; i < daysOfWeek.length; i++) {
console.log(daysOfWeek[i]);
}
添加元素
let numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
- 在数组末尾插入元素
numbers[numbers.length] = 10;
// 使用push
numbers.push(11);
numbers.push(12, 13);
- 在数组开头插入元素
// 在开头插入元素需要将所有后面元素往后移动一位
Array.prototype.insertFirstPosition = function(value) {
for (let i = this.length; i > 0; i--) {
this[i] = this[i - 1];
}
this[0] = value;
};
numbers.insertFirstPosition(-1);
// unshift
numbers.unshift(-2);
numbers.unshift(-4, -3); // 注意顺序
删除元素
- 从末尾删除
numbers.pop();
- 从数组开头删除
// 整理数组
Array.prototype.reIndex = function(myArray) {
const newArray = [];
for (let i = 0; i < myArray.length; i++) {
if (myArray[i] !== undefined) {
newArray.push(myArray[i]);
}
}
return newArray;
}
// 手动移除第一个元素
Array.prototype.removeFirstPosition = function() {
for (let i = 0; i < this.length; i++) {
this[i] = this[i + 1];
}
return this.reIndex(this);
}
numbers = numbers.removeFirstPosition();
// 使用shift方法
numbers.shift();
在任意位置添加或删除元素
- splice()
numbers.splice(5, 3); // 删除从数组索引5开始的3个元素
numbers.splice(5, 0, 2, 3, 4); // 从数组索引5开始删除0个元素,添加三个元素
二维和多维数组
let averageTemp = [];
averageTemp[0] = [72, 75, 79, 79, 81, 81];
averageTemp[1] = [81, 79, 75, 75, 73, 73];
- 迭代二维数组元素
function printMatrix(arr) {
for (let i = 0; i < arr.length; i++) {
for (let j = 0; j < arr[i].length; j++) {
console.log(arr[i][j]);
}
}
}
printMatrix(averageTemp);
- 多维数组
const matrix3x3x3 = [];
for (let i = 0; i < 3; i++) {
matrix3x3x3[i] = [];
for (let j = 0; j < 3; j++) {
matrix3x3x3[i][j] = [];
for (let k = 0; k < 3; k++) {
matrix3x3x3[i][j][k] = i + j + k;
}
}
}
// 输出
for (let i = 0; i < matrix3x3x3.length; i++) {
for (let j = 0; j < matrix3x3x3[i].length; j++) {
for (let k = 0; k < matrix3x3x3[i][j].length; k++) {
console.log(matrix3x3x3[i][j][k]);
}
}
}
JS 数组方法参考
concat():连接 2 个或更多数组,并返回结果
const zero = 0; const positiveNumbers = [1, 2, 3]; const negativeNumbers = [-3, -2, -1]; let numbers = negativeNumbers.concat(zero, positiveNumbers);
- every():对数组中的每个元素运行给定函数,如果该函数对每个元素都返回 true,则返回 true
- some():对数组中的每个元素运行给定函数,如果任一元素返回 true,则返回 true
- forEach():对数组中的每个元素运行给定函数。这个方法没有返回值
- map():对数组中的每个元素运行给定函数,返回每次函数调用的结果组成的数组
- filter():对数组中的每个元素运行给定函数,返回该函数会返回 true 的元素组成的数组
- reduce():对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值
- join():将所有的数组元素连接成一个字符串
- indexOf():返回第一个与给定参数相等的数组元素的索引,没有找到则返回-1
- lastIndexOf():返回在数组中搜索到的与给定参数相等的元素的索引里最大的值
- slice():传入索引值,将数组里对应索引范围内的元素作为新数组返回
- sort():按照字母顺序对数组排序,支持传入指定排序方法的函数作为参数
- toString():将数组作为字符串返回
- valueOf():和 toString 类似,将数组作为字符串返回
- reverse():颠倒数组中元素的顺序,原先第一个元素现在变成最后一个,同样原先的最后一个元素变成了现在的第一个
ES6及数组新功能
方法 描述 @@iterator 返回一个包含数组键值对的迭代器对象,可以通过同步调用得到数组元素的键值对 copyWithin 复制数组中一系列元素到同一数组指定的起始位置 entries 返回包含数组所有键值对的@@iterator includes 如果数组中存在某个元素则返回 true,否则返回 false find 根据回调函数给定的条件从数组中查找元素,如果找到则返回该元素 findIndex 根据回调函数给定的条件从数组中查找元素,如果找到则返回该元素在数组中的索引 fill 用静态值填充数组 from 根据已有数组创建一个新数组 keys 返回包含数组所有索引的@@iterator of 根据传入的参数创建一个新数组 values 返回包含数组中所有值的@@iterator - 使用for...of循环迭代
for (const n of numbers) { console.log(n % 2 === 0 ? 'even' : 'odd'); }
- 使用@@iterator对象
let iterator = numbers[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 // 或者使用for...of for (const n of iterator) { console.log(n); }
- 数组的entries、keys和values方法
let aEntries = numbers.entries(); // 得到键值对的迭代器 console.log(aEntries.next().value); // [0, 1] console.log(aEntries.next().value); // [1, 2] console.log(aEntries.next().value); // [2, 3] const aKeys = numbers.keys(); console.log(aKeys.next()); // { value: 0, done: false } console.log(aKeys.next()); // { value: 1, done: false } const aValues = numbers.values(); console.log(aValues.next()); // { value: 1, done: false } console.log(aValues.next()); // { value: 2, done: false }
- 使用from方法
let numbers2 = Array.from(numbers); // 使用过滤函数 let evens = Array.from(numbers, x => (x % 2 == 0));
- 使用Array.of方法
let numbers3 = Array.of(1); let numbers4 = Array.of(1, 2, 3); let numbersCopy = Array.of(...numbers4);
- 使用fill方法
let numbersCopy = Array.of(1, 2, 3, 4, 5, 6); numbersCopy.fill(0); // [0, 0, 0, 0, 0, 0] numbersCopy.fill(2, 1); // [0, 2, 2, 2, 2, 2] numbersCopy.fill(1, 3, 5); // [0, 2, 2, 1, 1, 2] let ones = Array(6).fill(1); // [1, 1, 1, 1, 1, 1]
- 使用copyWithin方法
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]
- 排序元素
numbers.reverse(); // 反序
numbers.sort(); // 默认将元素看做字符串进行排序
numbers.sort((a, b) => a - b); // 自定义比较函数
- 搜索
console.log(numbers.indexOf(10)); // 返回与参数匹配的第一个参数的索引
console.log(numbers.lastIndexOf(10)); // 返回与参数匹配的的最后一个元素的索引
类型数组
类型数组用于存储单一类型的数据。使用 WebGL API、进行位操作、处理文件和图像时,类型数组都可以大展拳脚。
let myArray = new TypedArray(length);
类型数组 | 数据类型 |
---|---|
Int8Array | 8位二进制补码整数 |
Uint8Array | 8位无符号整数 |
Uint8ClampedArray | 8位无符号整数 |
Int16Array | 16位二进制补码整数 |
Uint16Array | 16位无符号整数 |
Int32Array | 32二进制补码整数 |
Uint32Array | 32位无符号整数 |
Float32Array | 32位IEEE浮点数 |
Float64Array | 64位IEEE浮点数 |