flatten函数中一些不明白的地方
来源:12-10 电子书嵌套目录解析
godlanbo
2019-12-28
array.map返回就是数组,为什么还要用对象展开符呢?直接[].concat(array.map())和这个有什么不同吗?
还有就是,为什么还有一个else if,没懂,这里还可能存在什么情况。item.navPoint不存在就是没有子目录,存在一个数组就是有子目录,还有其他情况吗?
写回答
2回答
-
你好,这个问题极好,没想到你这么用心,关注到这种到非常细节的问题,你的问题乍一看是没毛病的,如果直接用 array.map 在很多场景下都不会出问题:
function flatten(array) { return [].concat(array.map(item => { // ... })) }
或者直接使用 array.map 作为返回值:
function flatten(array) { return array.map(item => { // ... }) }
但是这只是在大多数场景下!在解析目录这种非常复杂的数据结构时是不管用的,你可以尝试做一个修改,然后再上传电子书,就会看到电子书目录解析报错了:
UnhandledPromiseRejectionWarning: TypeError: Cannot read property '$' of undefined
起初看到这个报错我也非常不解,后来经过反复调试,发现我们的数据变成了类似这样的结构:
[xxx,[yyy,zzz]]
扩展运算符是搞不定这种数据结构的:
const a = [1,[2,3]] console.log(...a); // 1, [2,3]
但是 [].concat 可以:
const a = [1,[2,3]] console.log([].concat(...a)); // [1, 2, 3]
这就是这里为什么要使用 [].concat(...a) 这种看似多余结构的精髓所在,不用心体会是理解不了这种写法的美感,希望你可以体会到!^_^
212019-12-28 -
Sam
2019-12-28
你的第二个问题 else if 是为了兼容 item.navPoint 为对象的场景,当然这里 item.navPoint 大多数场景下为数组,所以看不出什么效果,但是如果去掉这句,就有可能解不了某些场景
20
相似问题