Javascript-array-conclusion

A simple conclusion about array. This article was wrote in Chinese

数组

ECMAscript提供了让数组类似于其他数据结构的方法

栈方法 stack

栈是LIFO LAST IN FRIST OUT

提供的方法:

  • push()
    接受任意数量的参数, 向数组末尾添加元素, return value:修改后的数组的长度
  • pop()
    移除数组最后一项,并修改数组长度,return value:移除的元素

队列方法 queue

队列是FIFO FIRST IN FIRST OUT

提供的方法:

  • shift()
    移除数组开头第一项,return value:移除的item
  • unshift()
    接受任意数量的参数,向数组开头添加元素,return value:修改后的数组的长度

重排序方法

提供的方法:

  • reverse()
    倒转数组,此方法会改变原数组,return value:The reversed array
  • sort()
    默认情况下sort()按照升序排列数组,小的在前,大的在后. return value: The sorted array. Note that the array is sorted in place, and no copy is made.
    但是sort()会调用数组每一项的toString()方法,然后在根据结果进行比较。
    例子:

    1
    2
    3
    var arr = [0,1,10,15,5];
    arr.sort();
    console.log(arr); // 0,1,10,15,5

    sort()可以接受一个比较函数作为参数.如果第一个参数应该位于第二个参数之前,返回一个负数,如果第一个参数应该位于第二个参数之后,返回一个正数。
    To compare numbers instead of strings, the compare function can simply subtract b from a. The following function will sort the array ascending (if it doesn’t contain Infinity and NaN):

    1
    2
    3
    function compareNumbers(a, b) {
    return a - b;
    }

    If compareFunction(a, b) is less than 0, sort a to an index lower than b, i.e. a comes first.
    If compareFunction(a, b) returns 0, leave a and b unchanged with respect to each other, but sorted with respect to all different elements. Note: the ECMAscript standard does not guarantee this behaviour, and thus not all browsers (e.g. Mozilla versions dating back to at least 2003) respect this.
    If compareFunction(a, b) is greater than 0, sort b to a lower index than a.
    compareFunction(a, b) must always return the same value when given a specific pair of elements a and b as its two arguments. If inconsistent results are returned then the sort order is undefined.

操作方法

提供的方法:

  • concat()
    可以接受参数,首先创建数组副本,然后将参数中的数据添加到数组末尾,如果参数是一个或者多个数组,那么将参数中的每一项都添加到数组末尾。
  • slice()
    基于当前数组的一个或者多个item来创建一个新的数组,slice不会影响原来的数组。
    可以接受一个或者两个参数
    如果只有一个参数,那么从参数指定的起始位置,到数组末尾
    如果有两个参数,从起始位置到结束为止,但是不包含结束位置
    如果参数是负数,则用数组长度加上参数来确定起始位置
  • splice()
    用法:
    • 删除
      需要指定两个参数,要删除的位置,和要删除的item的个数
      splice(0,2)
    • 插入
      需要指定三个参数,插入的起始位置,要删除的个数0,要插入的item
    • 替换
      需要指定三个参数,起始位置,要替换的个数,新的任意数量的item

位置方法

提供的方法

两种方法比较时都使用严格相等 ===
可以接受一到两个参数,第一个参数是要查找的item,第二个参数是查找开始的位置

  • indexOf()
    返回要查找的item在数组中的位置,没找到返回-1
  • lastIndexOf()
    返回要查找的item在数组中的位置,没找到返回-1

迭代方法

接受一个函数作为参数,另一个可选参数是this,这些方法都不会改变原始数组
作为参数传入的函数,会收到三个参数,item,index,array。每一项,每一项的index,数组对象本身

  • every()
    对每一项运行传入的函数,都return true,最后return true。否则return false
  • filter()
    filter会返回一个数组,由对每一项运行传入的函数,所有返回true的item组成
  • forEach()
    对每一项目执行传入的函数,没有返回值
  • map()
    对每一项执行传入的函数,返回值是一个数组,由每一项的函数运行结果组成
  • some()
    对每一项执行传入的函数,如果有一个返回true,则some也会返回true

缩小方法

提供的方法:

接受两个参数,在每一项上调用的函数,和一个可选的,作为缩小参数的初始值。
传入的函数会接受到四个函数,前一个值,当前值,index和数组对象,这个函数的任何返回值,都会作为前一个值传给下一项。
如果没有缩小参数的初始值,第一次迭代发生在数组的第二项,因此前一个值为数组的第一项。
如果有,第一次迭代发生在数组的第一项身上,当前值为数组的第一项,前一个值为缩小参数的初始值。

  • reduce()
  • reduceRight()
1
2
3
4
5
6
7
var list1 = [[0, 1], [2, 3], [4, 5]];
var list2 = [0, [1, [2, [3, [4, [5]]]]]];
const flatten = arr => arr.reduce(
(prev,curr) => prev.concat(
Array.isArray(curr) ? flatten(curr) : curr
),[]
);