一、数组扁平化
1.利用for循环
循环数组元素,如果还是一个数组,就递归调用该方法
function flatten(arr) {
var res = [];
for (let i = 0, length = arr.length; i < length; i++) {
if (Array.isArray(arr[i])) {
res = res.concat(flatten(arr[i])); //concat 并不会改变原数组
//res.push(...flatten(arr[i])); //扩展运算符
} else {
res.push(arr[i]);
}
}
return res;
}
2.利用reduce
reduce的用法如下:
array.reduce(function(total, currentValue, currentIndex, arr), initialValue);
/*
total: 必需。初始值, 或者计算结束后的返回值。
currentValue: 必需。当前元素。
currentIndex: 可选。当前元素的索引;
arr: 可选。当前元素所属的数组对象。
initialValue: 可选。传递给函数的初始值,相当于total的初始值。
*/
代码如下:
function flatten(arr) {
return arr.reduce((res,next) =>{
return res.concat(Array.isArray(next)? flatten(next) : next);
},[]);
}
3.利用ES6的...
ES6 增加了扩展运算符...,用于取出参数对象的所有可遍历属性,拷贝到当前对象之中
function flatten(arr) {
while (arr.some(item => Array.isArray(item))) {
arr = [].concat(...arr);
}
return arr;
}
二、数组去重
1.利用ES6的Set去重
function unique(arr) {
return Array.from(new Set(arr));
}
2.利用indexOf去重
function unique(array) {
var res = [];
for (var i = 0, len = array.length; i < len; i++) {
var current = array[i];
if (res.indexOf(current) === -1) {
res.push(current)
}
}
return res;
}
function unique(arr){
return arr.reduce(function(prev, next){
if(prev.indexOf(next) === -1){
prev.push(next);
}
return prev;
}, []);
}
3.利用sort()排序后去重
我们先对数组进行排序,为了不影响原数组,我们使用了concat()方法,返回新数组。将排序好的数组进行相邻位的比较。如果不相等,推到结果数组里。相等跳过操作。
function unique(array) {
var sortArr = array.concat().sort() //返回新数组
var res = [sortArr[0]]
for(var i=1; i < sortArr.length; i++) {
if(sortArr[i] !== sortArr[i-1]) {
res.push(sortArr[i])
}
}
return res
}