zoukankan      html  css  js  c++  java
  • JS数组技巧

    https://juejin.im/post/5d54e78be51d4561b072dce6

    https://juejin.im/post/5d71fff5f265da03e4678328#heading-6

    https://juejin.im/post/5cd0438c6fb9a031ec6d3ab2

    1、数组取交集

    const a = [0, 1, 2, 3, 4, 5]
    const b = [3, 4, 5, 6, 7, 8]
    const duplicatedValues = [...new Set(a)].filter(item => b.includes(item))
    duplicatedValues // [3, 4, 5]

    1-1、数组取差集

    const a = [0, 1, 2, 3, 4, 5]
    const b = [3, 4, 5, 6, 7, 8]
    const diffValues = [...new Set([...a, ...b])].filter(item => !b.includes(item) || !a.includes(item)) // [0, 1, 2, 6, 7, 8]

    2、数组去重

    const arr = [1, 1, 2, 2, 3, 4, 5, 5]
    const newArr = [...new Set(arr)]

    3、生成类似[1-100]这样的的数组:

    // fill
    const arr = new Array(100).fill(0).map((item, index) => index + 1)
    
    // ... + array.keys() 评论区大佬指出 生成的是0-99的数组
    const ary = [...Array(100).keys()] 

    4、数组解构赋值应用

    // 交换变量
    [a, b] = [b, a]
    [o.a, o.b] = [o.b, o.a]
    // 生成剩余数组
    const [a, ...rest] = [...'asdf'] // a:'a',rest: ["s", "d", "f"]

    //浅拷贝

      const arr = [1, 2, 3]
      const arrClone = [...arr]
      // 对象也可以这样浅拷贝
      const obj = { a: 1 }
      const objClone = { ...obj }

    //数组合并
    const arr1 = [1, 2, 3]
    const arr2 = [4, 5, 6]
    const arr3 = [7, 8, 9]
    const arr = [...arr1, ...arr2, ...arr3]

    5、数组转对象

    const arr = [1, 2, 3, 4]
    const newObj = {...arr} // {0: 1, 1: 2, 2: 3, 3: 4}
    const obj = {0: 0, 1: 1, 2: 2, length: 3}
    // 对象转数组不能用展开操作符,因为展开操作符必须用在可迭代对象上
    let newArr = [...obj] // Uncaught TypeError: object is not iterable...
    // 可以使用Array.form()将类数组对象转为数组
    let newArr = Array.from(obj) // [0, 1, 2]

     6、强大的reduce

    array.reduce 遍历并将当前次回调函数的返回值作为下一次回调函数执行的第一个参数。

    利用 array.reduce 替代一些需要多次遍历的场景,可以极大提高代码运行效率。

    1. 利用reduce 输出一个数字/字符串

    假如有如下每个元素都由字母's'加数字组成的数组arr,现在找出其中最大的数字:(arr不为空)

    const arr = ['s0', 's4', 's1', 's2', 's8', 's3']
    
    // 方法1  进行了多次遍历,低效
    const newArr = arr.map(item => item.substring(1)).map(item => Number(item))
    const maxS = Math.max(...newArr)
    
    // 方法2  一次遍历
    const maxS = arr.reduce((prev, cur) => {
      const curIndex = Number(cur.replace('s', ''))
      return curIndex > prev ? curIndex : prev
    }, 0)

          2、 利用reduce 输出一个数组/对象

    const arr = [1, 2, 3, 4, 5]
    
     // 方法1  遍历了两次,效率低
    const value = arr.filter(item => item % 2 === 0).map(item => ({ value: item }))
    
    // 方法1  一次遍历,效率高
    const value = arr.reduce((prev, curr) => {
        return curr % 2 === 0 ? [...prev, { value: curr }] : prev
    }, [])
  • 相关阅读:
    Comet OJ
    AtCoder Grand Contest 002题解
    AtCoder Grand Contest 001 题解
    线性基求交
    2019牛客暑期多校训练营(第四场)题解
    AtCoder Grand Contest 036题解
    计算几何 val.2
    计算几何 val.1
    模拟退火学习笔记
    动态点分治学习笔记
  • 原文地址:https://www.cnblogs.com/xiaolucky/p/13187408.html
Copyright © 2011-2022 走看看