indexOf
利用数组的实例方法indexOf 方法
indexOf:检测当前数组对象中是否包含了指定的元素,包含返回索引,否则-1
语法:数组.indexOf(key)
思路:遍历原数组,将原数组中的每个元素逐个判断并添加到新的数组中
如果新数组中已经存在了即将添加的值,就不再添加,只添加没有的元素
var arr = [1,2,1,2,1,2,1,2,1,2,1,1,1,1];
function unique(arr){
if(!Array.isArray(arr)){
return;
}
const LEN = arr.length;
if (LEN === 0) {
return;
}
var newArr = [];
for (let i = 0; i < LEN ; i++) {
if (newArr.indexOf(arr[i]) === -1) {
newArr.push(arr[i]);
}
}
return newArr;
}
console.log(unique(arr));
splice
使用数组的实例方法splice方法,直接删除原数组中的内容
splice:可以对数组实现增删改的操作
思路:遍历数组,用当前数组元素和后续的元素逐个比较,后续的元素只要和当前的元素相同就被删掉
var arr = [1,2,1,2,1,2,1,2,1,2,1,1,1,1,2,2,2];
function unique(arr){
if(!Array.isArray(arr)){
return;
}
if (arr.length === 0) {
return;
}
for (let i = 0; i < arr.length - 1; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (arr[i] === arr[j]) {
//j--是为了抵消j++
arr.splice(j--,1);
}
}
}
return arr;
}
console.log(unique(arr));
哈希
哈希去重:根据哈希数据结构的特点,哈希中的数据都是键值对数据
key+value的形式,key是具有唯一性的
实现的思路:将数组的所有的元素都作为对象的key添加到对象中,value是无所谓的
对象中的所有的key就是去重之后的结果
var arr = [1,2,1,2,1,2,1,2,1,2,1,1,1,1,2,2,2];
function unique(arr){
if(!Array.isArray(arr)){
return;
}
const LEN = arr.length;
if (LEN === 0) {
return;
}
var obj = {};
var newArr = [];
//遍历数组元素
for (let i = 0; i < arr.length; i++) {
//如果arr[i]不是obj的key,存在的话就不用再添加
if(!obj[arr[i]]){
//value值任意
obj[arr[i]] = "a";
newArr.push(arr[i]);
}
}
return newArr;
}
console.log(unique(arr));
ES6 …(扩展运算符)和set
let arr = [10,20,30,40,50,30,40,60];
let s = [...new Set(arr)];
console.log(s);//[10, 20, 30, 40, 50, 60]
扩展运算符
扩展运算符(spread)是三个点(…)。它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列。
set
ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。
Set
本身是一个构造函数,用来生成 Set 数据结构。