返回
手写JS——纵横捭阖,玩转数组去重与扁平化
前端
2023-11-27 02:24:34
前言
在JS的手写面试题中,关于数组的题目数不胜数,其中数组去重和数组扁平化更是基础中的基础。然而,在看似简单的题目中,却隐藏着许多值得我们挖掘的JS知识。今天,我们就将带领您领略手写JS的魅力,探索数组去重与扁平化的各种解法,从最基本的ES6 Set去重到巧妙的递归和reduce技巧,全方位展示JS代码的灵活性。无论您是初学者还是经验丰富的程序员,这里都有适合您的内容,快来一起见证代码的艺术!
一、数组去重
数组去重在面试中是一道基础题,但仍然可以在其中挖掘许多js知识。
1. ES6 Set 去重
ES6中新增了Set数据结构,它可以自动去重,因此我们可以轻松实现数组去重:
const arr = [1, 2, 3, 4, 5, 1, 2, 3];
const uniqueArr = [...new Set(arr)];
console.log(uniqueArr); // [1, 2, 3, 4, 5]
2. 双重循环外层循环,内层循环
这种方法在面试中比较常见,因为它相对简单易懂:
function uniqueArr(arr) {
const unique = [];
for (let i = 0; i < arr.length; i++) {
if (!unique.includes(arr[i])) {
unique.push(arr[i]);
}
}
return unique;
}
3. 索引对象外层循环,构造一个对象,并利用对象的键的唯一性来实现去重
这种方法利用了对象的键的唯一性,因此可以高效地实现数组去重:
function uniqueArr(arr) {
const uniqueObj = {};
for (let i = 0; i < arr.length; i++) {
uniqueObj[arr[i]] = true;
}
return Object.keys(uniqueObj);
}
二、数组扁平化
数组扁平化是指将嵌套的数组元素全部打平成一个一维数组。扁平化在实际开发中非常常见,比如我们想要对数组进行排序、过滤或合并等操作时,往往需要先将数组扁平化。
1. 递归扁平化
递归是一种非常直观的方法,我们可以通过递归将嵌套的数组逐层展开,最终得到一个一维数组:
function flattenArr(arr) {
const result = [];
for (let i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) {
result.push(...flattenArr(arr[i]));
} else {
result.push(arr[i]);
}
}
return result;
}
2. reduce扁平化
reduce是数组的另一个强大方法,我们可以通过reduce将数组中的元素逐个累加,最终得到一个一维数组:
function flattenArr(arr) {
return arr.reduce((acc, cur) => {
return acc.concat(Array.isArray(cur) ? flattenArr(cur) : cur);
}, []);
}
3. concat扁平化
concat方法可以将多个数组合并成一个新的数组,我们可以利用这个特性来实现数组扁平化:
function flattenArr(arr) {
return arr.reduce((acc, cur) => acc.concat(cur), []);
}
结语
在本文中,我们探索了数组去重与扁平化的各种解法,从最基本的ES6 Set去重到巧妙的递归和reduce技巧,全方位展示了JS代码的灵活性。希望这些知识能够帮助您在未来的开发中更加游刃有余。当然,如果您还有其他更好的解法,欢迎在评论区留言与我们分享!