数组
创建和初始化数组
let a = new Array();
let b = new Array(5);
let c = new Array('a','b','c');
使用new关键字就能简单地声明并初始化一个数组。不过更好的方式是使用[]:
let a = [];
let b = ['a','s','f'];
访问元素和迭代元素
let a = ['a', 'c', 'b'];
for(let i = 0; i < a.length; i++) {
console.log(a[i]);
}
求斐波那契数列的前20个数字。第一个数字是1,第二个数字是2,第三项开始,每一项都等于前两项数字之和:
let fibonacci = [];
fibonacci[0] = 1;
fibonacci[1] = 2;
for(let i = 2; i <= 19; i++) {
fibonacci[i] = fibonacci[i - 1] + fibonacci[i - 2];
}
console.log(fibonacci);
添加元素
push()方法:
把元素添加到数组的末尾。
unshift()方法:
插入元素到数组首位
删除元素
pop()方法:删除最后的元素。
shift()方法:删除数组第一个元素。
在任意位置上添加或删除元素
splice(a, b)方法:删除从索引a开始b长度个元素
a = [1,2,3,4,5,6,7,8,9]
a.splice(2,2)
console.log(a); //[1, 2, 5, 6, 7, 8, 9]
现在想删除元素的同时添加元素:
a = [1,2,3,4,5,6,7,8,9]
a.splice(2,2,9,9,9)
console.log(a); //[1, 2, 9, 9, 9, 5, 6, 7, 8, 9]
多维数组
假设要创建一个333的矩阵:
let matrix3x3x3 = [];
for(let i = 0; i<3; i++) {
matrix3x3x3[i] = [];
for(let j = 0; j<3; j++) {
matrix3x3x3[i][j] = [];
for(let z = 0; z<3; z++) {
matrix3x3x3[i][j][z] = i+j+z
}
}
}
console.log(matrix3x3x3);
数组方法参考
concat方法进行数组合并
let zero = 0;
let positiveNumbers = [1,2,3]
let negativeNumbers = [-3,-2,-1]
let numbers = negativeNumbers.concat(zero, positiveNumbers)
console.log(numbers); //[-3,-2,-1, 0, 1,2,3]
迭代器函数
every方法:会迭代数组中的每个元素,直到返回false。
let isEven = function(x) {
console.log(x);
return (x % 2 == 0) ? true :false;
};
let numbers = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];
numbers.every(isEven) // 1 1不是2的倍数,所以isEven返回false,every执行结束。
some方法:迭代数组的每个元素直到函数返回true。
numbers.some(isEven) // 1 2
forEach方法:迭代整个数组,与for循环结果相同。
numbers.forEach(function(x) {
console.log((x % 2 == 0));
})
map方法和filter方法:这两个方法返回新数组。
let myMap = numbers.map(isEven);
console.log(myMap) // [false, true, false, true, false, true,false, true, false,true, false, true,false, true, false]
let evenNumbers = numbers.filter(isEven);
console.log(evenNumbers) //[2, 4, 6, 8, 10, 12, 14]
reduce方法:接收一个函数作为参数,这个函数有四个参数:previousValue、currentValue、index、array。这个函数会返回一个将被叠加到累加器的值,reduce方法停止执行后会返回这个累加器。如果要对一个数组中的所有元素求和这就很有用,比如:
numbers.reduce(function(previous, current, index) {
return previous+current
}); //120
ES6和ES7新增的数组方法
1.使用forEach和箭头函数迭代:
numbers.forEach(x => console.log(x % 2 == 0))
2.使用for…of循环迭代:
for (let n of numbers) {
console.log((n % 2 == 0) ? 'even' : 'odd');
}
3.使用ES6新的迭代器(@@iterator):
ES6为Array增加了一个@@iterator属性,需要通过Symbol.iterator来访问:
let iterator = numbers[Symbol.iterator]();
console.log(iterator.next().value); //1
console.log(iterator.next().value); //2
数组的entries、keys、values方法:
- entries方法返回包含键值对的@@iterator:
let aEntries = numbers.entries(); //得到键值对的迭代器
console.log(aEntries.next().value); //[0,1]
- keys方法返回包含数组索引的@@iterator:
let aKeys = numbers.keys(); //得到数组索引的迭代器
console.log(aKeys.next()); //{value: 0, done: false}
- values方法返回的@@iterator包含数组的值:
let aValues = numbers.values(); //得到数组索引的迭代器
console.log(aValues.next()); //{value: 1, done: false}
4.from方法:根据已有的数组创建一个新数组。比如要复制numbers数组。可以:
let numbers2 = Array.from(numbers)
还可以传来一个用来过滤值的函数:
let evens = Array.from(numbers, x => (x % 2 == 0));
5.Array.of方法:根据传入的参数创建一个新数组:
let numbers3 = Array.of(1,2);
//等同于
let numbers3 = [1,2]
可以用此方法复制已有的数组:
let numbersCopy = Array.of(...numbers3)
6.fill方法:用静态值填充数组:
let ones = Array(6).fill(1)
7.copyWithin方法:复制数组中的一系列元素到同一数组指定的起始位置:
let copyArray = [1,2,3,4,5,6];
copyArray.copyWithin(0,3);
console.log(copyArray); //[ 4, 5, 6, 4, 5, 6 ]
let b = [1,2,3,4,5,6]
b.copyWithin(1,3,5); //把位置3开始到5(不包含)的元素复制到位置1
console.log(b); //[ 1, 4, 5, 4, 5, 6 ]
排序元素
reverse()方法反序,sort()方法在对数组排序时把元素默认成字符串进行相互比较,可以传入比较函数。
1.自定义排序
可以对任何对象类型的数组排序,也可以创建compareFunction来比较元素。例如,对象Person根据年龄排序:
let friends = [
{name: 'John', age: 30},
{name: 'Ana', age: 20},
{name: 'Chris', asge:25}
];
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)); //[{ name: 'Ana', age: 20 },{ name: 'John', age: 30 },{ name: 'Chris', asge: 25 }]
搜索
indexOf方法返回与参数匹配的第一个元素的索引,lastIndexOf返回与参数匹配的最后一个元素的索引。
find和findIndex方法:
let numbers = [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(numbers.find(multipleOf13)); //13
console.log(numbers.findIndex(multipleOf13));//12
两个方法都接收一个回调函数,搜索一个满足回调函数条件的值。
includes方法:
numbers.includes(15) //true
//还可以指定一个起始索引
输出数组为字符串
toString方法:把数组里的所有元素输出为一个字符串。
如果想用一个不同的分隔符把元素隔开可以使用join方法:
let a = numbers.join('-')