@15013890200
2018-08-24T06:49:50.000000Z
字数 1584
阅读 656
原生javascript array
之前有整理过JavaScript的一些常用方法,链接,今天再来整理三个关于数组的常用方法,去重、排序、扁平化多维数组和拷贝数组
去重
function removeDuplicate(arr) {/*** 利用对象的特性达到数组去重,性能很好* */if(!arr || arr.length < 2)return arr;let obj = {};let data = [];for(let i = 0,len = arr.length; i < len; i++){if(!obj[arr[i]]){obj[arr[i]] = true;data.push(arr[i]);}}return data;}
去重的方法有很多,网上一抓一大把,我这里只介绍我最喜欢用的,个人也觉得时间复杂度最低的,巧妙的利用对象不可重复的特性,在代码量和理解上都是最能够接受的。值得注意的是es6提供了
array.from方法,在数组去重代码量上更简洁。
排序
function sort(arr) {/*** 数值数组的排序* */if(!arr || arr.length < 2)return arr;arr.sort(compare);return arr;}function compare(val1,val2) {return val1-val2;}
javascript自带的sort,默认是对string进行排序,即使你传入的是数值数组输出结果也是按照string来排的。
当然,网上的数组排序方法也很多,选择排序、快速排序、递归排序等。感兴趣的可以自行百度了解,笔者依然只介绍笔者最偏爱的排序方法。
该方法有个弊端,只能用于javascript语言,因为它中间还是调用了javascript的sort方法,不过传入了一个compare方法作为参数。代码量上十分精简,不过理解上就没那么直观了。
扁平化
//方法一function flattenStr(arr) {/*** 先将数组转化为字符串,再将字符串分割* */let str = arr.join(',');return str.split(',');}//方法二function flatten(arr) {/*** 一个个出栈数组的元素* 判断元素是否是数组* ... 是es6的运算符:将一个数组转为用逗号分隔的参数序列。* */if(!arr || arr.length < 1)return arr;let arr2 = [...arr].reverse();let data = [];while(arr2.length){let item = arr2.pop();if(Array.isArray(item)){arr2.push(...item.reverse());}else {data.push(item);}}return data;}
方法一:实现和阅读都很简单,缺点:会改变原来数组的数据类型,返回的数组一律都是字符串数组
方法二:实现稍微复杂,但是可以保证数据原样输出。
当对输出数据没那么严格要求时,或者有特殊要求时(转化为string)方法一是最好的,其他情况最好用方法二。
拷贝数组
function copy(arr) {return JSON.parse(JSON.stringify(arr));}
拷贝数组方法可以利用JSON的特性,也可以用枚举的方法赋值给新数组。这里我只介绍自己最偏爱也是最优的数组拷贝方法。
最后,和之前的做法一样,将方法赋值给全局变量util的相关属性,这样就可以通过window.util.或者util.来调用相关的方法。
window.util = {'removeDuplicate': removeDuplicate,'sort': sort,'flatten': flatten,'flattenStr': flattenStr,'copy': copy};
