我们在项目实践的过程中经常遇到的问题或者面试的时候经常被问到的问题就是对数组的操作,老生常谈的问题有:去重、取不同、取相同,本文主要记录这些常用的操作的简单、高效的实现方法。
1、数组去重
// 去重方法1--对象方法(es5)
var arr = [1, 2, 3, 4, "a", "b", "c", 2, 3, "c"];
var obj = {};
var newArr = [];
arr.forEach(item => {
if (!obj[item]) {
newArr.push(item);
obj[item] = true;
}
});
console.log('es5方法:',newArr)
// 去重方法2--new Set()
let arr = [1, 2, 3, 4, "a", "b", "c", 2, 3, "c"];
let arrSet = new Set(arr);
let newArr = Array.from(arrSet);
console.log('set方法:',newArr)
2、两个数组之间的比较
// ES6获取
let arr1 = ["a", "b", "c", 2, 3, 4];
let arr2 = [4, 5, 6, "a", "ab", "c"];
// 获取相同
let sameArr = arr1.filter(x => arr2.includes(x));
console.log("sameArr:",sameArr);
// 获取不同
let diffArr = arr1.filter(x => !arr2.includes(x)).concat(arr2.filter(x => !arr1.includes(x)))
console.log("diffArr:",diffArr);
// 获取相同(es5)
var arr1 = ["a", "b", "c", 2, 3, 4];
var arr2 = [4, 5, 6, "a", "ab", "c"];
var obj ={};
var sameArr =[];
arr1.forEach(item=>{
obj[item] = true
});
arr2.forEach(item =>{
if(obj[item]){
sameArr.push(item)
}
})
console.log("sameArr:",sameArr);
var arr1 = ["a", "b", "c", 2, 3, 4];
var arr2 = [4, 5, 6, "a", "ab", "c"];
// 去重后的数组
var arr =[];
var obj = {};
var sameObj = {};
// 连接2个数组,先去重,并记录重复的,获取到的去重数组再去掉重复过的元素,不就是不同的了吗
var arr3 = arr1.concat(arr2);
arr3.forEach(item=>{
if(!obj[item]){
arr.push(item);
obj[item] = true;
}else{
// 相同的记录下来,后面再去除
sameObj[item] = true
}
});
var diffArr =[];
arr.forEach(item=>{
if(!sameObj[item]){
diffArr.push(item)
}
});
console.log("diffArr",diffArr)
总的来说:ES6后使用一些新的特性和方法会简单一点,ES5据测试使用对象+单个数组遍历的方法更高效一点。