前言

今天遇到这样一道题:

已知如下数组:

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

jquery 多维数组提交_javascript

jquery 多维数组提交_jquery 多维数组提交_02

 

 真是一山堪比一山高呀,小女子服服服!


总结

朋友给我推荐了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~,也很不错的方法,还比我的省了一步!