Flatten数组的几种写法

334 阅读1分钟

⭐️突发奇想,写下 flatten 的几种写法,层层递进,达到最优,希望对大家的工作和面试有帮助。

第一种写法,使用 reduce,内部递归,估计性能不咋地。

// reduce 递归
function flat(arr) {
  return arr.reduce((a, b) => a.concat(Array.isArray(b) ? flat(b) : b), []);
}

第二种写法,直接递归,同上性能稍好一点,但也不咋地。

function flat(arr) {
  return Array.isArray(arr) ? [].concat(...arr.map(flat)) : arr;
}

第三种写法,迭代,只要有一个元素是数组,就拍平一层,性能一般,与嵌套层数挂钩。

function flat(arr){ 
    while(arr.some(Array.isArray(item)){ 
        arr = [].concat(...arr); 
    } 
    return arr;
}

第四种写法,内部 dfs,收集结果,性能尚可。

function flat(arr) {
  const res = [];
  const dfs = (ar) => {
    if (Array.isArray(ar)) 
        ar.forEach(dfs);
    else res.push(ar);
  };
  dfs(arr);
  return res;
}

第五种写法,用迭代模拟 dfs,性能最佳。

function flat(arr) {
  const res = [],
    st = arr.slice().reverse();
  while (st.length) {
    const item = st.pop();
    if (Array.isArray(item)) {
      st.push(...item.slice().reverse());
    } else res.push(item);
  }
  return res;
}