作者:书苑幽香 | 来源:互联网 | 2024-10-21 12:52
前言
今天遇到这样一道题:
已知如下数组:
var arr = [[1,2,3],[3,4,5,5],[6,7,8,9,[11,12,[13,[14]]]],10];
将数组扁平化去重并按升序排列的数组;
咋一看,这一道题还怪吓人类呀,这TMD是几维数组呀,眼都数花了,
在日常的开发中一般都是处理json数据,最多来个二维数组循环啥的就解决了,
当时心里那个毛毛的,写循环吧,这得循环多少次呀,自己看着都吐的感觉;
心里就一直想着能怎么取到里面的每个元素,然后排序就OK啦,但是怎么能一次取到呢?
当时想的是先转字符串,再字符串去重,发现字符串去重好麻烦,还要循环;
js中数组的方法:
toString(): toString() 在把数组转换成字符串时,首先要将数组的每个元素都转换为字符串。
join():join() 方法可以把数组转换为字符串,不过它可以指定分隔符。
sort() :方法对数组的元素进行排序。(该函数很适合字符串,如果数字按照字符串来排序,则 "25" 大于 "100",因为 "2" 大于 "1",因此,sort() 方法对数值排序时我们通过一个比值函数)
js中字符串的方法:
split() 方法是 String 对象方法, 与 join() 方法操作正好相反。
ES6中Set()的用法:
Set是es6新增的数据结构,似于数组,但它的一大特性就是所有元素都是唯一的,没有重复的值,我们一般称为集合。
Set本身是一个构造函数,用来生成 Set 数据结构。
let arr1 = [...new Set(t)]; /* es6的...解构 */
let arr2= Array.from(new Set(t) ); /* Array.from()解析类数组 */
实现
var arr = [[1,2,3],[3,4,5,5],[6,7,8,9,[11,12,[13,[14]]]],10];// 平铺转字符串
var s = arr.toString(); // 转成数组并去重
let t = [...new Set(s.split(','))];// 比对排序
let newArr = t.sort((a,b)=>{ return a-b })
console.log(newArr)
从一小友哪里发现数组去重还有一个比new Set()性能好的方法: for...of + Object
真是一山堪比一山高呀,小女子服服服!
总结
朋友给我推荐了flat();
Array.prototype.flat()用于将嵌套的数组“拉平”,变成一维数组。该方法返回一个新数组,对原数据没有影响.
flat(2): 表示拉平的层数, 默认为1层,2 表示两层;如果不管有多少层嵌套,都要转成一维数组,可以用Infinity关键字作为参数。
var arr = [[1,2,3],[3,4,5,5],[6,7,8,9,[11,12,[13,[14]]]],10];/*** 拉平成一维数组 */
let s = arr.flat(Infinity);let t = [...new Set(s)]; let newArr = t.sort((a,b)=>{ return a-b })console.log(newArr)
good~,也很不错的方法,还比我的省了一步!