flatten函数中一些不明白的地方

来源:12-10 电子书嵌套目录解析

godlanbo

2019-12-28

图片描述
array.map返回就是数组,为什么还要用对象展开符呢?直接[].concat(array.map())和这个有什么不同吗?
还有就是,为什么还有一个else if,没懂,这里还可能存在什么情况。item.navPoint不存在就是没有子目录,存在一个数组就是有子目录,还有其他情况吗?

写回答

2回答

Sam

2019-12-28

你好,这个问题极好,没想到你这么用心,关注到这种到非常细节的问题,你的问题乍一看是没毛病的,如果直接用 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) 这种看似多余结构的精髓所在,不用心体会是理解不了这种写法的美感,希望你可以体会到!^_^

2
1
godlanbo
非常感谢老师,自己测试了一下,果然有些细微的差别
2019-12-28
共1条回复

Sam

2019-12-28

你的第二个问题 else if 是为了兼容 item.navPoint 为对象的场景,当然这里 item.navPoint 大多数场景下为数组,所以看不出什么效果,但是如果去掉这句,就有可能解不了某些场景

2
0

Vue Element+Node.js开发企业通用管理后台系统

基于Element的中后台课程,一套中小型企业通用的后台管理系统

2829 学习 · 1714 问题

查看课程