最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • js中数组的常见操作

    正文概述 掘金(爱笑的阿呆)   2021-04-07   373

    数组去重

    • for 循环 + indexOf
      function unique(arr) {
          let uniqueArr = []
          const len = arr.length
          for (let i = 0; i < len; i++) {
              if (uniqueArr.indexOf(arr[i]) == -1) {
                  uniqueArr.push(arr[i])
              }
          }
          return uniqueArr
      }
      const arr = [1,2,1,3,'1',2,3,4]
      const result = unique(arr)
      console.log(result) // [ 1, 2, 3, '1', 4 ]
      
    • 排序后去重
      function unique(arr) {
          let uniqueArr = []
          let sortArr = arr.concat().sort()
          let len = sortArr.length
          let prev
          for (let i = 0; i < len; i++) {
              if (!i || prev !== sortArr[i]) {
                  uniqueArr.push(sortArr[i])
              }
              prev = sortArr[i]
          }
          return uniqueArr
      }
      const arr = [1,2,1,3,'1',2,3,4]
      const result = unique(arr)
      console.log(result) // [ 1, '1', 2, 3, 4 ]
      
    • 哈希表
      function unique(arr) {
          let uniqueArr = []
          let obj = {}
          const len = arr.length
          for (let i = 0; i < len; i++) {
              obj[typeof arr[i] + arr[i]] = arr[i]
          }
          for (let i in obj) {
              uniqueArr.push(obj[i])
          }
          return uniqueArr
      }
      const arr = [1, 2, 1, 3, '1', 2, 3, 4]
      const result = unique(arr)
      console.log(result) // [ 1, 2, 3, '1', 4 ]
      
    • 利用 set 结构
      function unique(arr) {
          return Array.from(new Set(arr))
      }
      const arr = [1, 2, 1, 3, '1', 2, 3, 4]
      const result = unique(arr)
      console.log(result) // [ 1, 2, 3, '1', 4 ]
      

    数组扁平化

    • 遍历递归
      function flatten(array, dep = 1) {
          let result = []
          for(let i = 0; i < array.length; i++) {
              if(dep > 0) {
                  if(Array.isArray(array[i])){
                      result = result.concat(flatten(array[i], dep - 1))
                  }else {
                      result.push(array[i])
                  } 
              }else {
                  result.push(array[i])
              }
          }
          return result
      }
      const arr = [1, [2,[3,4]],5,6]
      const result = flatten(arr)
      console.log(result) // [ 1, 2, [3, 4], 5, 6 ]
      
    • 数组的 flat 方法
      function flatten(array) {
          return array.flat(Infinity)
      }
      const arr = [1, [2,[3,4]],5,6]
      const result = flatten(arr)
      console.log(result) // [ 1, 2, 3, 4, 5, 6 ]
      
      flat 方法接受一个参数表示想要拉平的层数,默认为1
    • 扩展运算符
      function flatten(array, dep = 1) {
          while (array.some(item => Array.isArray(item)) && dep > 0) {
              dep--
              array = [].concat(...array);
          }
          return array
      }
      const arr = [1, [2,[3,4]],5,6]
      const result = flatten(arr)
      console.log(result) // [ 1, 2, [ 3, 4 ], 5, 6 ]
      
    • 利用 reduce
      function flatten(array, dep = 1) {
          let result = []
          if (dep > 0) {
              result = array.reduce((total, value)=> {
                  return total.concat(Array.isArray(value) ? flatten(value, dep - 1) : value)
              }, [])
          } else {
              result = array.slice()
          }
          return result
      }
      const arr = [1, [2,[3,4]],5,6]
      const result = flatten(arr)
      console.log(result) // [ 1, 2, [ 3, 4 ], 5, 6 ]
      

    数组的随机排列

    数组的随机排列就像洗扑克牌一样

    function shuffle(array) {
        const len = array.length
        for (let i = len - 1; i > 0; i--) {
            const randomIndex = Math.floor(Math.random() * (i + 1)) 
            swap(array, i, randomIndex)
        }
    }
    

    reduce

    • demo
      const res = [1,2,3,4,5].reduce(function (a, b, i) {
          return a + b;
      })
      console.log(res) // 15
      const res1 = [1,2,3,4,5].reduce(function (a, b, i) {
          return a + b;
      }, 10);
      console.log(res1) // 25
      
    • 模拟实现
      Array.prototype.reduce = function(callback, total) {
          const array = this
          if (array.length === 0 && arguments.length < 2) {
              throw new Error('TypeError: Reduce of empty array with no initial value')
          }
          let startIndex
          let result
          if (arguments.length >= 2) {
              startIndex = 0
              result = total
          }else {
              startIndex = 1
              result = array[0]
          }
          for (let i = startIndex; i < array.length; i++) {
              result = callback(result, array[i], i, array)
          }
          return result
      }
      

    常用方法

    • 静态方法
      • Array.isArray() 返回一个布尔值,表示参数是否为数组
      • Array.from() 用于将两类对象转为真正的数组:类似数组的对象和可遍历(iterable)的对象(set和map)
      • Array.of() 用于将一组值,转换为数组
    • 改变原数组
      • push() 向数组的末尾添加一个或更多元素
      • pop() 删除并返回数组的最后一个元素
      • unshift() 向数组的开头添加一个或更多元素
      • shift() 删除并返回数组的第一个元素
      • reverse() 颠倒数组中元素的顺序
      • splice() 删除原数组的一部分成员,并可以在删除的位置添加新的数组成员
      • sort() 对数组的元素进行排序,默认是按照字典顺序排序
      • fill() fill方法使用给定值,填充一个数组
    • 不改变原数组
      • concat() 用于多个数组的合并,返回一个新数组
      • slice() 用于提取目标数组的一部分,返回一个新数组
      • join() 以指定参数作为分隔符,将所有数组成员连接为一个字符串返回,默认逗号分隔
      • map() 将数组的所有成员依次传入参数函数,然后把每一次的执行结果组成一个新数组返回
      • forEach() 对数组的所有成员依次执行参数函数,不返回值
      • filter() 用于过滤数组成员,满足条件的成员组成一个新数组返回
      • every() 所有成员的返回值都是true,整个every方法才返回true
      • some() 只要一个成员的返回值是true,则整个some方法的返回值就是true
      • keys(),values(),entries() 用于遍历数组,使用for of
      • reduce() 从左到右依次处理数组的每个成员,最终累计为一个值
      • reduceRight() 从右到左依次处理数组的每个成员,最终累计为一个值
      • indexOf() 返回给定元素在数组中第一次出现的位置,如果没有出现则返回-1,不能搜索NaN
      • lastIndexOf() 返回给定元素在数组中最后一次出现的位置,如果没有出现则返回-1
      • find() 用于找出第一个符合条件的数组成员,如果没有符合条件的成员,则返回undefined
      • findIndex() 返回第一个符合条件的数组成员的位置,如果所有成员都不符合条件,则返回-1
      • includes() 返回一个布尔值,表示某个数组是否包含给定的值
      • flat() 用于将嵌套的数组“拉平”,变成一维的数组,该方法返回一个新数组,对原数据没有影响

    更多文章

    • 阿呆的博客

    起源地下载网 » js中数组的常见操作

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元