@15013890200
2018-08-24T14:49:50.000000Z
字数 1584
阅读 560
原生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
};