JS如何优雅的处理扁平化和去重 - 一道面试题引发的思考

简介: JS如何优雅的处理扁平化和去重 - 一道面试题引发的思考

一道面试题引发的思考


面试题


前几天学员群里面在讨论面试题。题目如下,要求要用尽量少的代码进行处理尽量不要超过五行。


// 输入数据
const input =  [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10]
// 输出数据
expect =  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]


其实这个就是一个比较基础的算法题。 需要处理扁平化、排序、去重三个问题,而且最好是能够利用函数式的写法这样代码就会简洁一些。


学霸答案


const ary = [[1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14]]]], 10]
console.log('ary', [... new Set(ary.flat(Infinity))].sort((a, b) => a - b))


解析一下:


  • 扁平化使用ary的flat方法


  • Set方式去重


  • 排序sort常规操作


  • 最后用...展开为数组 整个过程非常流畅,确实是学霸答案。感觉这些常用的函数运用的想自己的手脚一般自如。


扁平化的实现方法


1. flat函数


扁平化最简洁的方法就是flat


// depth代表展开深度默认值1
// Infinity为无限深度
const newArray = arr.flat([depth]);


2. 循环+递归 (5行)


const flatten = input => {
    result = []
    input.forEach(v => Array.isArray(v) ? result = result.concat(flatten(v)) : result.push(v))
    return result
}


3. 归并方法:reduce


(1行 不过太难于理解了)


reduce的第二个参数:作为归并基础的初始值


const flatten = input => input.reduce((prev, next) => prev.concat(Array.isArray(next) ? flatten(next) : next), []);


4. ...扩展运算符(ES6)


5行代码


const flatten = input => {
    while(input.some(v => Array.isArray(v))){
        input = [].concat(...input)
    }
    return input
}


5. toString法


一行代码

只适用于数组元素全部为数字的情况下


const flatten = ary => ary.toString().split(",").map(v => +v)


数组去重


1. 一般方法


const uniq = input => input.reduce((cur, next) => cur.indexOf(next) !== -1 ? cur : [...cur, next], [])


  • 对象键值 + reduce 去重


速度最快, 占空间最多(空间换时间)


该方法执行的速度比其他任何方法都快, 就是占用的内存大一些。
现思路:新建一js对象以及新数组,遍历传入数组时,判断值是否为js对象的键,
不是的话给对象新增该键并放入新数组。
注意点:判断是否为js对象键时,会自动对传入的键执行“toString()”,
不同的键可能会被误认为一样,例如n[val]-- n[1]、n["1"];
解决上述问题还是得调用“indexOf”。*/


const obj = {}
const uniq = input => input.reduce((cur, next) => obj[next] ? cur : obj[next] = true && [...cur, next], [])


2. 排序相邻去重


一行搞定排序 + 去重


const uniq = input => input.sort((a, b) => a > b).reduce((cur, next) => cur[cur.length - 1] === next ? cur : [...cur, next], [])


3.数组下标法


const uniq = input => input.reduce((cur, next, i) => input.indexOf(next) !== i ? cur : [...cur, next], [])


4. Set去重


const uniq = input => [... new Set(input)]



相关文章
|
3月前
|
JSON JavaScript 前端开发
Javascript基础 86个面试题汇总 (附答案)
该文章汇总了JavaScript的基础面试题及其答案,涵盖了JavaScript的核心概念、特性以及常见的面试问题。
63 3
|
3月前
|
前端开发 JavaScript
JavaScript 面试系列:如何理解 ES6 中 Generator ?常用使用场景有哪些?
JavaScript 面试系列:如何理解 ES6 中 Generator ?常用使用场景有哪些?
|
2月前
|
前端开发 JavaScript 算法
使用 JavaScript 数组方法实现排序与去重
【10月更文挑战第21天】通过灵活运用 `sort()` 方法和 `filter()` 方法,我们可以方便地实现数组的排序和去重。同时,深入理解排序和去重的原理,以及根据实际需求进行适当的优化,能够更好地应对不同的情况。可以通过实际的项目实践来进一步掌握这些技巧,并探索更多的应用可能性。
110 59
|
4月前
|
JavaScript 前端开发
常见的JS面试题
【8月更文挑战第5天】 常见的JS面试题
65 3
|
1月前
|
JSON JavaScript 前端开发
[JS]面试官:你的简历上写着熟悉jsonp,那你说说它的底层逻辑是怎样的?
本文介绍了JSONP的工作原理及其在解决跨域请求中的应用。首先解释了同源策略的概念,然后通过多个示例详细阐述了JSONP如何通过动态解释服务端返回的JavaScript脚本来实现跨域数据交互。文章还探讨了使用jQuery的`$.ajax`方法封装JSONP请求的方式,并提供了具体的代码示例。最后,通过一个更复杂的示例展示了如何处理JSON格式的响应数据。
37 2
[JS]面试官:你的简历上写着熟悉jsonp,那你说说它的底层逻辑是怎样的?
|
3月前
|
JavaScript
js数组去重
js数组去重
108 55
|
2月前
|
Web App开发 JavaScript 前端开发
前端Node.js面试题
前端Node.js面试题
|
2月前
|
JavaScript 索引
js数组去重的常见方法
js数组去重的常见方法
45 0
|
4月前
|
存储 JavaScript 前端开发
2022年前端js面试题
2022年前端js面试题
47 0
|
4月前
|
存储 JavaScript 前端开发
JS浅拷贝及面试时手写源码
JS浅拷贝及面试时手写源码