JS数组

作者: 綪比纸薄 | 来源:发表于2020-03-31 22:07 被阅读0次

    创建数组

    let arr = []
    let arr1 = new Array() // 或 let arr = Array() 方法可以传递一个参数 为数组长度  Array(6)
    let arr2 = Array(6)
    console.log(arr2.length) //6
    // ES6
    let arr3 = Array.form({}) // []
    let arr4 = Array.of() // []
    

    数组方法

    • push(), pop()
    • shift(), unshift()
    • join()
    • sort()
    • reverse()
    • concat()
    • slice()
    • splice()
    • toString(), toLocaleString()
    • indexOf(), lastIndexOf() // ES5
    • forEach() // ES5
    • filter() // ES5
    • map() // ES5
    • every() // ES5
    • some() // ES5
    • reduce(), reduceRight()
    • find() //ES6
    • findIndex() // ES6
    • copyWithin() // ES6
    • fill() // ES6
    • entries(), keys(), values()
    • includes()
    • flat(), flatMap()
    • Arrya.prototype.sort()
    • Array.from() // ES6
    • Array.of() // ES6

    push(), pop()

    push() 在数组的末尾增加一个或多个元素 并返回修改后的长度

    let a = []
    a.push('hello') // ['hello']
    a.push('1', '2') // ['hello', '1', '2']
    

    pop() 删除数组末尾一个元素,返回移除的值

    let aPop = a.pop()
    console.log(aPop) // 2
    console.log(a)  // ['hello', '1']
    

    shift(), unshift()

    shift() 删除数组的第一项,并返回删除的值
    unshift() 将参数添加到数组开头,并返回数组的新长度

    let aShift = a.shift() // 'hello'
    console.log(a) // ['1']
    let aUnshift = a.unshift('2', '3') // 3
    console.log(a) // ['2', '3', '1']
    

    jion()

    把数组转换称字符串, 然后使用参数链接一起

    let aJoin = a.join() //  2,3,1 默认是 ,
    let aJoin2 = a.join('-') // 2-3-1
    

    sort()

    将数组中的元素排序并返回排序后的数组。
    当不带参数调用sort()时, 数组元素以字母表顺序排序

    var a = new Array("banana", "orange", "apple")
    a.sort() // ["apple", "banana", "orange"]
    var b = [22,66,3,33]
    b.sort() // [22, 3, 33, 6] 字母顺序表
    b.sort(function(a, b) { return a - b }) // [3, 22, 33, 66] // 数值顺序
    

    reverse()

    将数组中的元素顺序颠倒, 返回逆序的数组

    var a = [1,3,4]
    a.reverse() // [4,3,1]
    

    concat()

    创建并返回一个新数组, 它的元素包括调用concat()的元素数组的元素和concat()的每个参数

    var a = [1,2,3]
    a.concat(4, 5) // [1,2,3,4,5]
    console.log(a) // [1,2,3]
    a.concat([4,5]) // [1,2,3,4,5]
    a.concat([4,5], [6,7]) // [1,2,3,4,5,6,7]
    a.concat(4, [5,[6, 7 ]]) // [1,2,3,4,5, [6,7]]
    

    slice()

    返回指定数组的一个片段或子数组 参数包头不包尾

    var a = [1,2,3,4,5]
    a.slice(0,3) // [1,2,3]
    a.slice(4) // [4,5]
    a.slice(1, -1) // [2,3,4]
    a.slice(-3, -2) // [3]
    

    splice()

    在数组中插入或删除元素的通用方法。不同于slice()和concat() splice()会修改调用的数组

    var a = [1,2,3,4,5,6,7,8]
    a.splice(4) // 返回[5,6,7,8] a: [1,2,3,4]
    a.splice(1,2) // [2, 3] a:[1,4]
    

    splice的第一个参数指定插入或删除的起始位置,第二个参数指定了要从数组中删除的个数。如果省略第二个参数 则是从起始点开始到结尾全部删除,紧随其后的任意参数指定了需要插入到数组中的元素

    toString() toLocaleString()

    将其每个元素转化为字符串,并且输出用逗号分隔的字符串

    var a = [1,3,4]
    a.toString() // 1,3,4
    

    toLocaleString()是toString()的本地化版本

    indexOf(), lastIndexOf()

    indexOf() 返回某个指定的字符串值在字符串中首次出现的位置
    lastIndexOf() 返回某个指定的字符串值在字符串中最后出现的位置

    var a = [1,2,3,2,4]
    a.indexOf(2) // 1
    a.lastIndexOf(2) // 3
    a.indexOf(2, 2) // 3 第二个参数是从Array 索引的起始位置, 默认 0
    

    数组的遍历

    • for循环
    var arr = [1,2,3,4]
    for (let i = 0; i < arr.length; i++ ){
      console.log(arr[i]) // 1,2,3,4
    }
    

    for循环有break语句 可以在循环过程中跳过(continue)某一项或者退出(break)

    • forEach()
      从头到尾为数组的每个元素执行一次指定的函数
    arr.forEach(function(item) {
      console.log(item) // 1;2;3;4;
    })
    

    function 回调参数 当前遍历数组内容, 索引和 数组本身

    arr.forEach(function(item, index, arr) {
      console.log(item, index, arr) // 1, 0 ,  [1, 2, 3, 4];  2, 1, [1, 2, 3, 4]; 3, 2, [1, 2, 3, 4]; 4 3  [1, 2, 3, 4]
    })
    arr.forEach((item, index, array) => array[index]  = item * 2)
    arr // [2, 4, 6, 8]
    

    forEach()没有break语句, 如果想要终止 必须把forEach()方法放在一个try块中,并抛出异常。

    • map()
      map()方法将调用的数组的每个元素传递给指定的函数,并返回一个数组,包含改函数的返回值
    a = [1,2,3]
    b = a.map(x => x*2)
    b // [2,4,6]
    
    • filter()
      filter()方法返回的数组元素是调用数组的一个子集。传递的函数用来逻辑判定,该函数返回true或false。
     a = [1,2,3,4,5]
     b = a.filter(x => x > 2)
     b // [3,4,5]
    
    • every()和some()
      every()和some()方法返回数组的逻辑判定。它们对数组元素进行指定的函数进行判定,返回true或false
      every():当数组中所有元素都满足判定函数才会返回true
      some():当数组中只要又一个元素满足判定函数就返回true
    a  = [1,2,3,4]
    a.every(x => x < 10)  // true 全部满足条件
    a.every(x => x >2) // false 有一个未满足
    a.some(x => x > 3) // true 有一个满足
    a.some(x => x > 10) // false  没有一个满足
    
    • reduce()和reduceRight()
      使用指定的函数将数组元素进行组合,生成单个值。
    var a = [1,2,3,4,5]
    var sum = a.reduce((x, y) => x + y, 0) // 15 数组求和
    var product = a.reduce((x, y) => x * y, 1) // 120 数组求积
    var max = a.reduce((x, y) => x > y ? x : y) // 5 数组求最大值
    

    reduce需要两个参数,第一个是执行简化操作的函数,化简函数就是用某种方法把两个值组成一个值,并返回。第二个(可选)的参数是一个传递给函数的初始值。默认为数组的第一个元素
    化简函数的参数和forEach(), map()使用的函数不同。es5默认操作函数的值为(数组元素, 元素索引, 和数组本身)。
    化简函数的第一个参数是到目前为止的化简操作累计的结果。第一次调用函数时,第一个参数是一个初始值,他就是传递给reduce()的第二个参数。在接下来调用中,这个值就是上次一化简函数的返回值。当不指定初始值的时候,它使用数组的第一个元素为初始值。
    在空数组上不带初始值调用reduce()会导致类型错误异常。如果给初始值,那么会直接返回初始值,而不会调用化简函数
    redcueRight()的工作原理和reduce()一样,不同的是它从右到左处理数组

    不推荐的方法

    • for in
      为Object设计 之所以能够遍历数组 是因为数组的构造函数是Object
      支持 continue 和 break
    var a = [1,2,3,4]
    for (let i in arr) {
      console.log(i, arr[i]) // 0 1, 1 2, 2 3, 3 4
    }
    arr.a = 7
    for (let i in arr) {
      console.log(i, arr[i]) // 0 1, 1 2, 2 3, 3 4, a 7. for in 会把对象属性遍历出来
    }
    

    es6

    • for of
      遍历可遍历的对象, 不只是数组,Object. 可以遍历出这两个常规对象之外的对象, 自定义结构

    • Array.prototype.from
      方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括 ES6 新增的数据结构 Set 和 Map)。
      伪数组:

      • 具有length属性
      • 根据索引储存数据
      • 不能调用数组的方法
      • 可遍历
        比如: function中的 arguments, class 选择器获取的结果. NodeList
        如果伪数组想使用数组的方法, 需要把伪数组转化为数组
    // ES5转换方法
    let arr = [].slice.call(arguments)
    let imgs = [].slice.call(document.querySelectorAll('img'))
    
    // Array.prototype.from
    let args = Array.from(arguments)
    let imgs = Array.from(document.querySelectAll('img'))
    
    Array.from(arrayLike, mapFn, this) // arrayLike  伪数组, 遍历方法, 函数指向的this
    // 遍历方法 对每个元素进行处理,将处理后的值放入返回的数组。
    

    生成一个新的数组

    // es5
    let array = Array(5)
    let array = []
    // es6
    let arr = Array.from({length: 5})
    // 初始化值为1
    // es5 需要进行循环赋值
    // es6
    let arr = Array.from({length: 5}, () => 1)
    arr // [1, 1, 1, 1, 1]
    
    • Array.prototype.of
      用于将一组值,转换为数组。
    // 将传入的所有的值转换为数组
    Array.of(1, 1, 1, 1, 1) // [1,1,1,1,1 ]
    Array.of(3) // [3]
    Array.of(3).length // 1
    // es5 的 Array
    Array() // []
    Array(1,2,3) // [1,2,3]
    Array(3) // [,,]
    
    • Array.prototype.fill
      fill方法使用给定值,填充一个数组。
      fill方法还可以接受第二个和第三个参数,用于指定填充的起始位置和结束位置。
    let arr = Array(5).fill(1)
    arr // [1,1,1,1,1]
    arr.fill(2, 1, 3)
    arr // [1, 2, 2, 1, 1]
    
    • find() 和 findIndex()
      找出第一个符合条件的数组成员, 遍历所有成员执行函数, 第一个返回true之后返回该成员,没有找到则返回undefined
    [1,2,3,4,5].find(n => n > 2) // 3
    [1,2,3,4,5].find((val, index, arr) => n > 2) // 3 三个参数 当前的值、当前的位置和原数组
    

    findIndex方法的用法与find方法非常类似,返回第一个符合条件的数组成员的位置,如果所有成员都不符合条件,则返回-1。

    相关文章

      网友评论

          本文标题:JS数组

          本文链接:https://www.haomeiwen.com/subject/ehiguhtx.html