数组小题目

数组去重

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],那么如果碰到深层嵌套的,就继续调用自身,只有所有数组元素都是非数组,才能退出递归,走第二个条件分支。所以这个推出条件很关键,不然就会一直递归递归递归。。。

你可能感兴趣的:(数组小题目)