在前端开发过程中,经常需要对多维数组进行扁平化并去重操作。在 ECMAScript 2017 中,新增了几种数组方法,使得这个操作变得更加简单高效。本文将介绍这些方法,并且给出最优实现,以便于开发者在实际工作中能够更好地应用。
数组扁平化
数组扁平化是将多维数组转换为一维数组的过程。在 ECMAScript 5 时代,我们可以使用递归方式实现数组扁平化,但是这种实现方式效率不高,因为在递归中需要频繁地创建和销毁函数调用栈。而在 ECMAScript 6 中,新增了 Array.prototype.flat()
方法,使得数组扁平化变得更加简单高效。
Array.prototype.flat()
Array.prototype.flat()
方法可以将多维数组转换为一维数组,它的语法如下:
arr.flat([depth])
其中 depth
参数表示递归深度,默认值为 1
。例如:
const arr = [1,[2,3],[[4],5]]; arr.flat(); // [1,2,3,[4],5] arr.flat(1); // [1,2,3,[4],5] arr.flat(2); // [1,2,3,4,5]
可以看到,flat()
方法把二维数组变成了一维数组,而不需要使用递归。
不过需要注意的是,如果不确定数组的维数,可以使用 Infinity
作为 depth
参数的值,例如:
const arr = [1,[2,3,[4,[5]]]]; arr.flat(Infinity); // [1,2,3,4,5]
扁平化多维对象数组
如果要扁平化多维对象数组,可以使用 flatMap()
方法,它的语法和用法与 flat()
方法类似。
const arr = [{id: 1, children: [{id: 2}]}, {id: 3}]; arr.flatMap(item => item.children ? [item, ...item.children] : item); // [{id: 1, children: [{id: 2}]}, {id: 2}, {id: 3}]
这里使用了 ES6 中的新语法 ...
(展开运算符),它可以将数组展开成一个个单独的值。
数组去重
数组去重是指将数组中重复的元素去除,只留下单个元素的过程。在 ECMAScript 5 时代,我们可以使用循环来实现数组去重,但是这种方式也效率不高,如果需要去重的数组很大,循环的时间复杂度会很高。在 ECMAScript 6 中,新增了 Set
数据结构,它天然支持去重操作,使得数组去重变得更加简单高效。
使用 Set
去重
Set
是一个集合,它的元素不重复。使用 Set
去重,在有些情况下效率可以达到线性级别(O(n)),比循环去重的效率要高很多。下面是使用 Set
实现去重的示例代码:
const arr = [1,2,3,3,4,5,5]; const set = new Set(arr); const newArr = [...set]; console.log(newArr); // [1,2,3,4,5]
在这个例子中,我们先把数组转换成了 Set
,然后再把 Set
转换成了数组。使用 ...
运算符可以将 Set
中的值转换成一个个单独的值。
使用 reduce()
去重
在某些情况下,我们需要对数组中的对象去重,此时使用 Set
会丢失对象的某些属性,因此需要使用 reduce()
去重。下面是使用 reduce()
实现对象去重的示例代码:
-- -------------------- ---- ------- ----- --- - --------------------------------------- --------------------- ----- ------ - ----------------- ------- ----- ---- - -------------- -- ------- --- -------- --------- ------------------- ----- ------ --------------- - ------ ----- -- ---- -------------------- -- -----------------------------------------
在这个例子中,我们使用了 Array.prototype.reduce()
方法,将数组转换成了一个对象,然后遍历数组中的每个元素,如果对象中已经有了相同的元素,则更新属性,否则将元素加入到对象中。
扁平化并去重
扁平化并去重是指将多维数组中的元素全部展开后,去除其中重复的元素,只留下单个元素的过程。在 ECMAScript 5 时代,我们可以通过循环来实现,但是这种方式效率很低。在 ECMAScript 2017 中,可以使用 Array.prototype.flat()
方法和 Set
数据结构来实现这个操作:
const arr = [1,[2,3],[[4],5]]; const newArr = [...new Set(arr.flat(Infinity))]; console.log(newArr); // [1,2,3,4,5]
首先使用 Array.prototype.flat()
方法将多维数组扁平化,然后使用 Set
去重,最后将 Set
转换成数组。
总结
在 ECMAScript 2017 中,新增了 Array.prototype.flat()
方法和 Set
数据结构,使得数组扁平化和去重操作变得更加简单高效。开发者可以通过合理使用这些方法,提高代码的可读性、可维护性和执行效率,从而更好地完成前端开发工作。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64b0ae8248841e9894cc4bf4