Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[js] 第60天 请实现一个flattenDeep函数,把多维数组扁平化 #252

Open
haizhilin2013 opened this issue Jun 14, 2019 · 22 comments
Labels
js JavaScript

Comments

@haizhilin2013
Copy link
Collaborator

第60天 请实现一个flattenDeep函数,把多维数组扁平化

@nusr
Copy link

nusr commented Jun 15, 2019

// const newArray = arr.flat(depth)
const temp = [1,2,[1,2]];
console.log(temp.flat(Infinity));
// [1,2,1,2]

@forever-z-133
Copy link

function flattenDeep(arr, deepLevel = Infinity) {
  if (deepLevel < 1) return arr;
  var needMoreDeep = deepLevel > 0;
  return [].concat(...arr.map(item => {
    return  Array.isArray(item) && needMoreDeep ? flattenDeep(item, deepLevel - 1) : item;
  }));
}
console.log(flattenDeep([1,2,3,[4,[5,[6]]]], 2)); // [1, 2, 3, 4, 5, [6]]

@Delicate-lee
Copy link

function fn(arr) {
let res = [];
(function gn(arr) {
arr.forEach(item => {
if(Array.isArray(item)) {
gn(item)
} else res.push(item)
})
})(arr)

return res
}

@tannnb
Copy link

tannnb commented Jun 16, 2019

function flattenDeep(arr) {
if(arr && arr.length == 0) {
return arr
}
return arr.toString().split(',')
}
flattenDeep([1,2,3,[4,[5,[6]]]]) // ["1", "2", "3", "4", "5", "6"]

@arronf2e
Copy link

function flattenDeep(arr, result = []) {
    var len = arr.length
    for(var i = 0;  i < len; i++) {
        if(Array.isArray(arr[i])) {
            flattenDeep(arr[i], result)
        }else {
            result.push(arr[i])
        }
    }
    return result
}

@haizhilin2013 haizhilin2013 added the js JavaScript label Jun 18, 2019
@HuaRongSAO
Copy link

基础数据:arr.toString().split(",");
复杂数据:const flatten = arr => [].concat(... arr.map(ar => Array.isArray(ar)?flatten(arr): ar)

@luobinhang
Copy link

function flatten (arr) {
  return arr.reduce((pre, current) => {
    return pre.concat(Array.isArray(current) ? flatten(current) : current)
  }, [])
}

@HuaRongSAO
Copy link

const flat = arrs => arrs.reduce((i,j) => Array.isArray(j)?[...i,...flat(j)]:[...i,j])

@MY729
Copy link

MY729 commented Jul 2, 2019

数组扁平化多种方法实现

@Konata9
Copy link

Konata9 commented Jul 8, 2019

const deepFlatten = (arr) => {
  let result = [];
  arr.forEach((item) => {
    Array.isArray(item)
      ? (result = [...result, ...deepFlatten(item)])
      : (result = [...result, item]);
  });

  return result;
};

const arr = [
  1,
  [2, 3, "a", ["b"], ["c", "d", "e"]],
  [4, 5, 6, [7, 8, 9, [10, 11, 12]]]
];
console.log(deepFlatten(arr));

@shufangyi
Copy link

Array.prototype.flattenDeep = function(layer = 3) {
  return this.reduce(
    (pre, curr) =>
      Array.isArray(curr) && layer > 0
        ? [...pre, ...curr.flattenDeep(layer - 1)]
        : [...pre, curr],
    []
  )
}

console.log([1, 2, 3, [4, 5, [6, 7, [8, 9, [10]]]]].flattenDeep(2))
// [ 1, 2, 3, 4, 5, 6, 7, [ 8, 9, [ 10 ] ] ]
console.log([1, 2, 3, [4, 5, [6, 7, [8, 9, [10]]]]].flattenDeep(+Infinity))
// [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]

@chenyouf1996
Copy link

// 扁平化
function flattenDeep(arr) {
  let newArr = []
  for (let i = 0; i < arr.length; i++) {
    if (!Array.isArray(arr[i])) {
      //当前元素不是数组则直接push
      newArr.push(arr[i])
    } else {
      //当前元素是数组则递归自身返回一维数组拼接
      newArr = newArr.concat(flattenDeep(arr[i]))
    }
  }
  return newArr
}
let arr = [[0, 1, 2, 3, 4], 5, [6, 7, [8, 9]]]
console.log(flattenDeep(arr)) // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

@ppppp-x-x
Copy link

ppppp-x-x commented Jul 30, 2019

function flatDeep (arr) {
  return arr.reduce((total, cur) => 
    total.concat(Object.prototype.toString.call(cur) === '[object Array]' ? flatDeep(cur) : cur)
  , []);
}

@jiamianmao
Copy link

const flat = arr => arr.toString().split(',')

@ducky-YFH
Copy link

function arrFlat(arr, res) {
  res = res || []
  for (key in arr) {
    if (arr[key] instanceof Array) {
      arrFlat(arr[key], res)
    } else {
      res.push(arr[key])
    }
  }
  return res
}

var arr = [1, 2, 3, [4, 5, 6, 7,[8,9,10,11]],[12,13,14,15]]
console.log(arrFlat(arr))

@NARUTOne
Copy link

NARUTOne commented Nov 6, 2019

// Array.prototype.flat
if (!Array.prototype.flat) {
  Array.prototype.flat = function (num = 1) {
    if (!Number(num) || Number(num) < 0) {
      return this;
    }
    var arr = [];
    this.forEach((item) => {
      if (Array.isArray(item)) {
        arr = arr.concat(item.flat(--num));
      } else {
        arr.push(item);
      }
    });
    return arr;
  };
}

@censek
Copy link

censek commented Nov 29, 2019

// const newArray = arr.flat(depth)
const temp = [1,2,[1,2]];
console.log(temp.flat(Infinity));
// [1,2,1,2]

涨知识了😁 flat

@ZindexYG
Copy link

使用 reduce、concat 和递归展开无限多层嵌套的数组

var arr1 = [1,2,3,[1,2,3,4, [2,3,4]]];

function flatDeep(arr, d = 1) {
   return d > 0 ? arr.reduce((acc, val) => acc.concat(Array.isArray(val) ? flatDeep(val, d - 1) : val), [])
                : arr.slice();
};

flattenDeep(arr1, Infinity);

@rni-l
Copy link

rni-l commented Jan 19, 2020

function flattenDeep(arr) {
  return arr.reduce((acc, cur) => {
    const _val = Array.isArray(cur) ? flattenDeep(cur) : [cur]
    return [...acc, ..._val]
  }, [])
}


console.log(flattenDeep(
  [
    1, 2, 3, [4, 5, [6, 7, [8, 9]]]
  ]
))

@HNHED
Copy link

HNHED commented Sep 5, 2021

`

<title>Document</title>
<script>

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

    const res2 = JSON.stringify(arr).replace(/\[|\]/g,"").split(',');
    console.log(res2)

    const res3 = JSON.parse('['+JSON.stringify(arr).replace(/\[|\]/g,'')+']');
    console.log(res3)

    const flatten = arr => {
        return arr.reduce(
            (pre,cur)=>{
                return pre.concat(Array.isArray(cur)?flatten(cur):cur)
        },[])
    }
    const res4 = flatten(arr);
    console.log(res4)

    const res5 = [];
    const fn = arr => {
        for(let i = 0;i<arr.length;i++){
            if(Array.isArray(arr[i])){
                fn(arr[i]);
            }else{
                res5.push(arr[i]);
            }
        }
    }
    fn(arr);
    console.log(res5);
</script>
`

@xiaoqiangz
Copy link

function flattenDeep(arr) {
return arr.reduce((prev, cur) => {
return Array.isArray(cur) ? prev.concat(flattenDeep(cur)) : prev.concat(cur)
}, [])
}
function flat(arr, result = []) {
arr.forEach(item => {
if (Array.isArray(item)) {
flat(item, result)
} else {
result.push(item)
}
})
return result
}
还有个数组自带的flat(Infinity)

@dragon-sing
Copy link

const flat = (arr) => {
  const newArr = [];
  for (let  i = 0; i < arr.length; i++) {
    if (!Array.isArray(arr[i])) {
      newArr.push(arr[i]);
    } else {
      newArr.push(...flat(arr[i]));
    }
  }
  return newArr;
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
js JavaScript
Projects
None yet
Development

No branches or pull requests