返回

手写JS——纵横捭阖,玩转数组去重与扁平化

前端

前言

在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代码的灵活性。希望这些知识能够帮助您在未来的开发中更加游刃有余。当然,如果您还有其他更好的解法,欢迎在评论区留言与我们分享!