数组

创建和初始化数组

  1. let a = new Array();
  2. let b = new Array(5);
  3. let c = new Array('a','b','c');

使用new关键字就能简单地声明并初始化一个数组。不过更好的方式是使用[]:

  1. let a = [];
  2. let b = ['a','s','f'];

访问元素和迭代元素

  1. let a = ['a', 'c', 'b'];
  2. for(let i = 0; i < a.length; i++) {
  3. console.log(a[i]);
  4. }

求斐波那契数列的前20个数字。第一个数字是1,第二个数字是2,第三项开始,每一项都等于前两项数字之和:

  1. let fibonacci = [];
  2. fibonacci[0] = 1;
  3. fibonacci[1] = 2;
  4. for(let i = 2; i <= 19; i++) {
  5. fibonacci[i] = fibonacci[i - 1] + fibonacci[i - 2];
  6. }
  7. console.log(fibonacci);

添加元素

push()方法:

把元素添加到数组的末尾。

unshift()方法:

插入元素到数组首位

删除元素

pop()方法:删除最后的元素。

shift()方法:删除数组第一个元素。

在任意位置上添加或删除元素

splice(a, b)方法:删除从索引a开始b长度个元素

  1. a = [1,2,3,4,5,6,7,8,9]
  2. a.splice(2,2)
  3. console.log(a); //[1, 2, 5, 6, 7, 8, 9]

现在想删除元素的同时添加元素:

  1. a = [1,2,3,4,5,6,7,8,9]
  2. a.splice(2,2,9,9,9)
  3. console.log(a); //[1, 2, 9, 9, 9, 5, 6, 7, 8, 9]

多维数组

假设要创建一个333的矩阵:

  1. let matrix3x3x3 = [];
  2. for(let i = 0; i<3; i++) {
  3. matrix3x3x3[i] = [];
  4. for(let j = 0; j<3; j++) {
  5. matrix3x3x3[i][j] = [];
  6. for(let z = 0; z<3; z++) {
  7. matrix3x3x3[i][j][z] = i+j+z
  8. }
  9. }
  10. }
  11. console.log(matrix3x3x3);

数组方法参考

concat方法进行数组合并

  1. let zero = 0;
  2. let positiveNumbers = [1,2,3]
  3. let negativeNumbers = [-3,-2,-1]
  4. let numbers = negativeNumbers.concat(zero, positiveNumbers)
  5. console.log(numbers); //[-3,-2,-1, 0, 1,2,3]

迭代器函数

every方法:会迭代数组中的每个元素,直到返回false。

  1. let isEven = function(x) {
  2. console.log(x);
  3. return (x % 2 == 0) ? true :false;
  4. };
  5. let numbers = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];
  6. numbers.every(isEven) // 1 1不是2的倍数,所以isEven返回false,every执行结束。

some方法:迭代数组的每个元素直到函数返回true。

  1. numbers.some(isEven) // 1 2

forEach方法:迭代整个数组,与for循环结果相同。

  1. numbers.forEach(function(x) {
  2. console.log((x % 2 == 0));
  3. })

map方法和filter方法:这两个方法返回新数组。

  1. let myMap = numbers.map(isEven);
  2. console.log(myMap) // [false, true, false, true, false, true,false, true, false,true, false, true,false, true, false]
  3. let evenNumbers = numbers.filter(isEven);
  4. console.log(evenNumbers) //[2, 4, 6, 8, 10, 12, 14]

reduce方法:接收一个函数作为参数,这个函数有四个参数:previousValue、currentValue、index、array。这个函数会返回一个将被叠加到累加器的值,reduce方法停止执行后会返回这个累加器。如果要对一个数组中的所有元素求和这就很有用,比如:

  1. numbers.reduce(function(previous, current, index) {
  2. return previous+current
  3. }); //120

ES6和ES7新增的数组方法

1.使用forEach和箭头函数迭代:

  1. numbers.forEach(x => console.log(x % 2 == 0))

2.使用for…of循环迭代:

  1. for (let n of numbers) {
  2. console.log((n % 2 == 0) ? 'even' : 'odd');
  3. }

3.使用ES6新的迭代器(@@iterator):

ES6为Array增加了一个@@iterator属性,需要通过Symbol.iterator来访问:

  1. let iterator = numbers[Symbol.iterator]();
  2. console.log(iterator.next().value); //1
  3. console.log(iterator.next().value); //2

数组的entries、keys、values方法:

  • entries方法返回包含键值对的@@iterator:
    1. let aEntries = numbers.entries(); //得到键值对的迭代器
    2. console.log(aEntries.next().value); //[0,1]
  • keys方法返回包含数组索引的@@iterator:
    1. let aKeys = numbers.keys(); //得到数组索引的迭代器
    2. console.log(aKeys.next()); //{value: 0, done: false}
  • values方法返回的@@iterator包含数组的值:
    1. let aValues = numbers.values(); //得到数组索引的迭代器
    2. console.log(aValues.next()); //{value: 1, done: false}

4.from方法:根据已有的数组创建一个新数组。比如要复制numbers数组。可以:

  1. let numbers2 = Array.from(numbers)

还可以传来一个用来过滤值的函数:

  1. let evens = Array.from(numbers, x => (x % 2 == 0));

5.Array.of方法:根据传入的参数创建一个新数组:

  1. let numbers3 = Array.of(1,2);
  2. //等同于
  3. let numbers3 = [1,2]

可以用此方法复制已有的数组:

  1. let numbersCopy = Array.of(...numbers3)

6.fill方法:用静态值填充数组:

  1. let ones = Array(6).fill(1)

7.copyWithin方法:复制数组中的一系列元素到同一数组指定的起始位置:

  1. let copyArray = [1,2,3,4,5,6];
  2. copyArray.copyWithin(0,3);
  3. console.log(copyArray); //[ 4, 5, 6, 4, 5, 6 ]
  4. let b = [1,2,3,4,5,6]
  5. b.copyWithin(1,3,5); //把位置3开始到5(不包含)的元素复制到位置1
  6. console.log(b); //[ 1, 4, 5, 4, 5, 6 ]

排序元素

reverse()方法反序,sort()方法在对数组排序时把元素默认成字符串进行相互比较,可以传入比较函数。

1.自定义排序

可以对任何对象类型的数组排序,也可以创建compareFunction来比较元素。例如,对象Person根据年龄排序:

  1. let friends = [
  2. {name: 'John', age: 30},
  3. {name: 'Ana', age: 20},
  4. {name: 'Chris', asge:25}
  5. ];
  6. function comparePerson(a, b) {
  7. if(a.age < b.age) {
  8. return -1
  9. }
  10. if(a.age > b.age) {
  11. return 1
  12. }
  13. return 0
  14. }
  15. console.log(friends.sort(comparePerson)); //[{ name: 'Ana', age: 20 },{ name: 'John', age: 30 },{ name: 'Chris', asge: 25 }]

搜索

indexOf方法返回与参数匹配的第一个元素的索引,lastIndexOf返回与参数匹配的最后一个元素的索引。

find和findIndex方法:

  1. let numbers = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];
  2. function multipleOf13(element, index, array) {
  3. return (element % 13 == 0) ? true : false;
  4. }
  5. console.log(numbers.find(multipleOf13)); //13
  6. console.log(numbers.findIndex(multipleOf13));//12

两个方法都接收一个回调函数,搜索一个满足回调函数条件的值。

includes方法:

  1. numbers.includes(15) //true
  2. //还可以指定一个起始索引

输出数组为字符串

toString方法:把数组里的所有元素输出为一个字符串。

如果想用一个不同的分隔符把元素隔开可以使用join方法:

  1. let a = numbers.join('-')