目的:把数组中重复的内容去掉。
eg:将数组[2, 3, 1, 4, 2, 2, 3, 4, 1, 5,”1″]变成[2, 3, 1, 4, 5, “1”]。
思路1:
每次取出数组 一项,和其他的所有项比较
如果比较 有相同的 , 把重复的这个(后面的)删掉。
<script>
var arr = [2, 3, 1, 4, 2, 2, 3, 4, 1, 5,"1"];
//遍历数组
for(var i=0;i<arr.length;i++){
//每次比较i 之后的内容
for(var j=i+1;j<arr.length;j++){
if(arr[i]===arr[j]){
//删除后面的这一个。
//j是位置,1表示长度。
//这个方法不清楚的 可以看我这一篇文章 https://segmentfault.com/a/1190000014973607
arr.splice(j,1);
//删除之后,数组长度会减1,要想比较剔除的后面一位。由于数组长度变短,后一位提前了,故j要减1。
j--;
}
}
}
console.log(arr);
</script>
思路二:
准备一个 空数组 res
然后遍历 arr
如果 arr中这一项 在 res中不存在,
则把这一项 放进 res中
如果 存在
什么都不做
最后得到的res,就是去重得到后的数组。
<script>
var arr = [2, 3, 1, 4, 2, 2, 3, 4, 1, 4, "1"]; // [2,3,1,4]
var res=[2];
for(var i=0;i<arr.length;i++){
//返回值不等于-1则表明,res中没有arr[i],这一项。
if(compare(res,arr[i])!==-1){
//往res中添加arr[i]这一项
res.push(arr[i]);
}
}
console.log(res);
function compare(res,arr) {
for(var j=0;j<res.length;j++) {
//如果遍历res过程中有相等值的话,立刻返回-1,结束遍历。
if(arr === res[j])
return -1;
}
//如果for 循环结束了,还没跳出函数,表示res中没有arr,则返回1。
return j;
}
</script>
思路一和思路二存在的缺点:如果数组内容中含有两个NAN,由于NAN不等于它自己。故删选不出来。
思路三:
统计所有项出现的次数,形成一个对象
对象的键名 是 每一项的元素 ,
对象的键值 是 该项出现的次数.
最后我们只需要 统计所有的键名就可以了
<script>
var arr = [2, 3, 1, 4, 2, 2, 3, 4, 1, 4, 2]; // [2,3,1,4]
var res={};
var resArr=[];
// {
// 2: 4,
// 3: 2,
// 1: 2,
// 4: 3
// }
for(var i=0;i<arr.length;i++){
// 键名 in 对象
// 如果对象中有此键名,则返回true
// 否则,返回false
if(arr[i] in res){
//存在,则对应的键值+1。
res[ arr[i] ]+=1;
}else{
//不存在,则设置对应键名,并且键值=1。
res[ arr[i] ]=1;
}
}
//遍历对象
for(i in res){
//将键名插入数组
resArr.push(i);
}
console.log(resArr);
</script>
这个方法存在的问题就是:
1.如果数组中存在数字1,和字符串“1”,当遍历键名的时候,两则是一样的,得到的数组会少了数字1.
2.键名是以字符串的方式存储的,插入数组的时候,也是以字符串的方式存储到数组中去。
改进思路三
<script>
var arr = [2, 2, 3, 4, 1, 4, 2,"1",undefined]; // [2,3,1,4]
var res={};
var resArr=[];
// {
// 2: 4,
// 3: 2,
// 1: 2,
// 4: 3
// }
for(var i=0;i<arr.length;i++){
//键名是 数据类型的前三位+arr[i]组成的字符串。
temp=(typeof arr[i]).substr(0,3)+arr[i];
if(temp in res){
res[ temp ]+=1;
}else{
res[ temp ]=1;
}
}
console.log(res);
for(i in res){
// 截取 键名的前三位
// substr(0,3)包括开始,不包括结束。截取的字符串 0,1,2位
var temp=i.substr(0,3);
if(temp=="num"){
//截取 键名从第三位开始截取。
resArr.push(Number(i.substring(3)));
}
if(temp=="str"){
resArr.push(i.substr(0,3));
}
if(temp=="und"){
resArr.push(undefined);
}
}
console.log(resArr);
</script>
思路四
使用 es6的Set ...
<script>
var arr = [2, 3, 1, 4, 2, 2, 3, 4, 1, 4, 2, "1", NaN, NaN]; // [2,3,1,4]
//Set方法可以去除数组内重复的
// ... 表明展开数组的每一项
var res=[...(new Set(arr))];
console.log(res);
</script>