Fe-interview: [js] 第119天 写一个方法把多维数组降维

Created on 12 Aug 2019  ·  10Comments  ·  Source: haizlin/fe-interview

第119天 写一个方法把多维数组降维

js

Most helpful comment

const arr = [1, 2, [3, 4, [5, 6]]]
arr.flat(Infinity)
// [1, 2, 3, 4, 5, 6]

All 10 comments

const arr = [1, 2, [3, 4, [5, 6]]]
arr.flat(Infinity)
// [1, 2, 3, 4, 5, 6]
function flattenDeep(arr) {
   return arr.reduce((acc, val) => Array.isArray(val) ? acc.concat(flattenDeep(val)) : acc.concat(val), []);
}

抄MDN上的,会把空项过滤。

  function handlerArr(arr, _rst) {
    const rst = _rst || [];
    arr.forEach(ele => {
      typeof ele === 'object' ? handlerArr(ele, rst) : rst.push(ele);
    });
    return rst;
  }
let arr = [1, 2, {}, 3, [4, {}, 5], [6, 7, [8, null, 9]]];
//递归
function flat (arr) {
  let ret = []
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] instanceof (Array)) {
      ret = ret.concat(flat(arr[i]))
    }
    else {
      ret.push(arr[i])
    }
  }
  return ret
}
console.log(flat(arr))
//ES10新增的内置方法
arr.flat(Infinity)
        function flatArr(arr){
            var result = [];
            arr.forEach((item)=>{
                if(Array.isArray(item)){
                    let subResult = flatArr(item);
                    result = result.concat(subResult);
                }else{
                    result[result.length] = item;
                }
            })
            return result;
        }
        console.log(flatArr([1, 2, [3, 4, [5, 6]]])) // [1, 2, 3, 4, 5, 6]
function flatten(arr, depth = 1) {
    if (!depth || !Array.isArray(arr)) return arr
    return arr.reduce((prev, mem) => 
        prev.concat(flatten(mem, depth - 1)), [])
}

怎么感觉和搬mdn的那位这么像...但是这个支持指定深度。

const flatArr = (arr, deep = false) =>
  arr.reduce((prev, cur) => {
    if (deep && Array.isArray(cur)) {
      return prev.concat(flatArr(cur, deep));
    } else {
      return prev.concat(cur);
    }
  }, []);

const arr = [1, [2, [3, [4, [5], 6], 7], 8], 9];
const arr2 = [{}, [{}, {}, {}, [2, 3, 4, [5, 6, 7, [{}, {}]]]]];
console.log(flatArr(arr, true));
const flatArr = (arr) => Array.isArray(arr)
  ? arr.reduce( (a, b) => [...a, ...flatArr(b)] , [])
  : [arr]

flatArr([1, [[2], [3, [4]], 5]])

const flatArray = arr => arr.flat(Infinity);

Was this page helpful?
0 / 5 - 0 ratings