一道关于 ARRAY 深度展开的面试题

栏目: 编程工具 · 发布时间: 7年前

内容简介:一道关于 ARRAY 深度展开的面试题

今天面试的时候,考官出了这么一个题,写一个函数,输入 a = [1,[2,3,[4,5,6]]] ,输出 a = [1,2,3,4,5,6] 。当时我脑子有点短路,做了好久,给出了个不太符合要求的答案如下

var a = [1,[2,3,[4,5,6]]]
var arr = []
function merge(a) {
  for(var i = 0; i < a.length; i++){
    if(Array.isArray(a[i])){
      merge(a[i])
    } else {
      arr.push(a[i])
    }
  }
  return arr
}

回家后稍微完善了下,符合了考官输入输出的要求了(不过也晚了)

function flatten(a) {
  if (!Array.isArray(a)) return

  var arr = []

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

然后跟朋友聊天问问有啥简单的方法,朋友给了一个挺符合这个题的简单方法类似如下

const flatten = (arr) => arr.toString().split(',').map(v => Number(v))

不过这个答案只适用于这道题,如果不是全数字的就不行了。于是在 GitHub 上搜索 array flatten ,看了看排名前三的源码,发现有好多不同的写法,比如

function flatten() {
  var args = Array.from(arguments)
  do {
    args = [].concat.apply([], args)
  } while (args.some(Array.isArray))
  return args
}

也有这么写的

function flatten (array) {
  var result = Array.prototype.concat.apply([], array)
  if (result.length === array.length) {
    return result
  }
  return flatten(result)
}

写法各不相同,还有好多看似类似,但细节上不一样的,所以关键就看性能了,好在 arr-flattenarray-flatten 中就都有 benchmark ,进行了各种比较

arr-flatten 这个项目中,在各种不同的、可以在 npm 上搜到的 array flatten 实现方法之间进行了比较,最后的结论是 array-flatten 执行的效率最高

一道关于 ARRAY 深度展开的面试题

array-flatten 项目里的 benchmark 主要是自己源码中细节不同的写法之间的差异,最后得出的最佳实践如下

function flatten (array) {
  if (!Array.isArray(array)) {
    throw new TypeError('Expected value to be an array')
  }
  return flattenFrom(array)
}

function flattenFrom (array) {
  return flattenDown(array, [])
}

function flattenDown (array, result) {
  for (var i = 0; i < array.length; i++) {
    var value = array[i]

    if (Array.isArray(value)) {
      flattenDown(value, result)
    } else {
      result.push(value)
    }
  }

  return result
}

这套代码思路与我给出的答案是一样的,但由于细节上的不同,导致用 benchmark 测试,执行效率比我写的那个快了约20%


以上所述就是小编给大家介绍的《一道关于 ARRAY 深度展开的面试题》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

订阅

订阅

[美] 罗伯特·金奇尔、马尼·佩伊万 / 中信出版集团 / 2018-12 / 68.00元

数据显示,年轻人现在每天看视频的时间已经超过电视。YouTube 平台每天的视频观看总时长超过10亿小时,这个数字还在增长。数字视频牢牢占据着人们的注意力。 数字时代如何实现创意变现?视频平台如何提升自己的品牌认知和广告号召力?想要在这个庞大的媒体生态中占据流量入口,你需要先了解 YouTube。在过去的10年里,互联网视频平台 YouTube 已经像60多年前的电影、广播和电视的发明一样,......一起来看看 《订阅》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

随机密码生成器
随机密码生成器

多种字符组合密码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换