第119天 写一个方法把多维数组降维
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);
Most helpful comment