内容简介:一道关于 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-flatten 和 array-flatten 中就都有 benchmark
,进行了各种比较
arr-flatten 这个项目中,在各种不同的、可以在 npm 上搜到的 array flatten
实现方法之间进行了比较,最后的结论是 array-flatten 执行的效率最高
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 深度展开的面试题》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 算法/NLP/深度学习/机器学习面试笔记
- 3w字深度好文|Redis面试全攻略,读完这个就可以和面试官大战几个回合了
- 收藏! 超全的 GitHub 计算机算法、机器学习、深度学习的面试指南集锦
- Python面试经验总结,面试一时爽,一直面试一直爽!
- 算法面试:数组编码面试问题
- 【面试虐菜】—— JAVA面试题(1)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。