美文网首页
数组小题目

数组小题目

作者: 四爷在此 | 来源:发表于2019-03-16 23:21 被阅读0次

    数组去重

    function rmDup(arr) {
      var tmp = [];
      return arr.filter((e) => { if (!tmp.includes(e)) { return tmp.push(e);return true; } })
    }
    
    // 方案二:用reduce
    function rmDup(arr) {
      return arr.reduce((agg, e) => {
        return agg.includes(e) ? agg : agg.concat(e);
      }, [])
    }
    
    // 方案三:用ES6 Set
    function rmDup(arr) { return Array.from(new Set(arr)) }
    

    对于第二种方案,稍微解释下。其实reduce我也用的少,不过在求和等情境下用的多。因为 Array.reduce(func, []) 的第一个参数是func(agg, element){}, agg 表示上一次迭代的返回值,element是当前迭代的数组元素。也就是说每次迭代都可以得到前一次迭代的数据。这就很适合累积性的计算场景。reduce 的第二个参数是初始数组,也就是遍历第一个数组元素时,func 收到的agg === []

    数组扁平化

    数组扁平化,实际上是降维的应用场景。有层次嵌套的数组扁平化,往往需要用到递归

    function flatArr(arr) {
      return [].concat(...arr.map(e => (Array.isArray(e) ? flatArr(e) : e )))
    }
    
    flatArr([11, [22, [ 33, 44]]]) // [11, 22, 33, 44]
    
    
    凡是能用递归的地方,都能用迭代实现。。。但是这道题貌似不能这么解.
    下面是第二个方案,语句更多,但是可读性强一些
    function flatArr(arr) {
      var res = [];
      arr.forEach((ele) => {
        // 凡遇到 ele 是数组,就需要再次递归展开
        if (Array.isArray(ele)) {
          res = res.concat(...flatArr(ele))  // 只要有嵌套,就继续递归,直到ele 是非数组元素
        } else {
          res.push(ele); // 只有非数组元素才能往最终 res 里面push
        }
      })
      return res;  // 所以保证 flatArr 返回都是扁平数组
    }
    

    ~~这道题思路其实也很简单,规则想得越简单越好实现,我们这个函数就是实现把[11, [22,33]] 这种类型转化为[11, 22, 33],那么如果碰到深层嵌套的,就继续调用自身,只有所有数组元素都是非数组,才能退出递归,走第二个条件分支。所以这个推出条件很关键,不然就会一直递归递归递归。。。

    相关文章

      网友评论

          本文标题:数组小题目

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