鍍金池/ 問答/HTML/ 怎么理解[].concat(...arr),單獨...arr報錯

怎么理解[].concat(...arr),單獨...arr報錯

背景:
多維數(shù)組展開
問題:

var arr = [1,2,[3,4,[5,6,[7,8],9],10]];
function fn(arr){
    return [].concat(arr.map(d=> Array.isArray(d)?fn(d):d))//(3)?[1, 2, Array(4)]
//  return [].concat(...arr.map(a=> Array.isArray(a)? fn(a):a))//(10)?[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
}

第一種寫法有什么問題嗎?為什么結(jié)果不理想
第二種方法應(yīng)該怎么斷句

回答
編輯回答
傻叼
  1. fn返回的是一個數(shù)組,所以結(jié)果肯定是一個多維數(shù)組
  2. concat只能接受數(shù)組作為參數(shù),"..."運算之后就不是數(shù)組了。
const flatten = (arr, depth = 1) =>
 arr.reduce((a, v) => a.concat(depth > 1 && Array.isArray(v) ? flatten(v, depth - 1) : v), > []);

來源:flatten

2017年10月19日 02:41
編輯回答
練命

... 后跟數(shù)組, 也就是 arr.map 的結(jié)果

2017年9月13日 08:25
編輯回答
孤毒

...擴(kuò)展運算 1 2?[3, 4, Array(4), 10]
依次map
教你個簡單的辦法 代碼執(zhí)行打斷點 一步一步走就清晰了

2017年8月5日 05:55
編輯回答
有你在

兩種的區(qū)別就在于...的使用。
第一種,。arr[0],arr[1]就不說了,arr[2]是數(shù)組會再次執(zhí)行fn, 不管結(jié)果是什么,return語句返回的都是數(shù)組,所以返回結(jié)果中arr[2]肯定就是數(shù)組了,再遞歸下去是一樣的道理。
第二種,arr[2]執(zhí)行的返回結(jié)果是一個數(shù)組,但是由于前面有函數(shù)參數(shù)展開符,會將arr[2]執(zhí)行的結(jié)果數(shù)組展開傳給concat進(jìn)行連接,后面遞歸一樣的原理

2018年6月5日 06:24
編輯回答
溫衫

你這第一個寫法 沒啥用啊
arr = [1,[3]]簡化

[].concat([1,[3]].map(d=> Array.isArray(d)? [].concat([3].map(a=>a)):d))

//[3].map(d=>d) 返回原數(shù)組 沒啥用 [].concat([3]) == [3]
//所以[1,[3]].map(d=> d)

[].concat([1,[3]].map(d=> d))

[].concat([1,[3]])

[1,[3]]
2018年9月19日 16:11