首页 > 解决方案 > 以这种方式使用平面地图是否合适?

问题描述

基本上,在回答与嵌套数组展平相关的 SO 问题之一时,我已经回答了使用递归展平的问题。

var exampleArray = [ [1,2,3,4], [1,2,[1,2,3]], [1,2,3,4,5,[1,2,3,4,[1,2,3,4]]] ];



function findArrayLengths(input) {
  return input.reduce((op,cur)=>{
    return Array.isArray(cur) ? op.concat(findArrayLengths(cur)) : op.concat(cur)
  },[])
}

let op = exampleArray.map(e=>{
  return findArrayLengths(e).length
})

console.log(op);

但我已经看到这段代码似乎也能正常工作(平面无限深度)我读过一些关于Array.prototype.Flat

var arr = [ [1,2,3,4], [1,2,[1,2,3]], [1,2,3,4,5,[1,2,3,4,[1,2,3,4]]], [[1,2,3,4], [1,2,[1,2,3]], [1,2,3,4,5,[1,2,3,4,[1,2,3,4]]]] ];

let op = arr.map(e=> e.flat(Infinity).length);

console.log(op);

所以问题是。像这样用 flat 进行深度展平是否合适,否则会产生后果。?

这是该问题的链接,您可以在此处查看更多信息https://stackoverflow.com/a/53844891/9624435

标签: javascriptarraysrecursionflat

解决方案


这是 es6 的方式,虽然它可以进一步使用,.reduce 而不是 forEach

const exampleArray = [ [1,2,3,4], [1,2,[1,2,3]], [1,2,3,4,5,[1,2,3,4,[1,2,3,4]]] ];

const flatten = (items) => {
  const flat = [];
  items.forEach(item => {
    if (Array.isArray(item)) {
      flat.push(...flatten(item));
    } else {
      flat.push(item);
    }
  });
  return flat;
}

const do_flat = (arr) =>  arr.map( (curr) => flatten(curr).length);

const output = do_flat(exampleArray);

console.log({output});


推荐阅读