今天说两个,一个是采用前后对比,删除其中一个的方法,另一个是利用对象的属性不重复而保存元素的方法。
1
先看第一个:
先来一个数组
vararr= [2,3,21,4,2,5,3];
接着创建一个空数组
varnewAarry= [];
还是进行前后对比,前后对比依旧用双层for循环
//利用双层for循环,外层循环负责遍历前一个数
for(vari=;i
//内层负责,前一个的后一项
for(varj=i+1;j
//在这里关键
}
}
在内层for循环中,还是要进行前一个和后一个的比较
//如果前一个和后一个相等
if(arr[i] ===arr[j]) {
//把后一项这一位数字删掉
arr.splice(j,1);
}
这就完了吗?还没有!现在我们删掉了数组中的其中一个,那数组长度就变了。可是我们还是会按照原来数组的长度去遍历。这样会出现错误,数组长度会越界。那怎么办?
if(arr[i] ===arr[j]) {
arr.splice(j,1);
//数组长度减小了,防止越界
j--;
}
加上这句j--。每次发现一样的删除之后马上让j的减掉一个再遍历,不然肯定越界。
好了,完整代码附上:
vararr= [2,3,21,4,2,5,3];
// var arr = ['周一', '周二', '周三', '周二', '周一'];
varnewAarry= [];
//还是前后对比
//利用双层for循环,外层循环负责遍历前一个数
for(vari=;i
//内层负责,前一个的后一项
for(varj=i+1;j
//如果前一个和后一个相等
if(arr[i] ===arr[j]) {
//把后一项这一位数字删掉
arr.splice(j,1);
//数组长度减小了,防止越界
j--;
}
}
}
2
再看第二个:
还是先来一个数组
vararr= ['周一','周二','周三','周二','周一'];
接着创建一个空数组,同时创建一个空对象
varnewAarry= [];
varobj= {};
我们都知道,对象的属性不能一样。我能不能把数组中的值都作为对象中的一个属性呢?二话不说先循环
for(vari=;i
vart=arr[i];
//console.log(typeof arr[i]);//string
}
循环之后我们发现arr[i]它的数据类型是字符串类型,如果我们把字符串类型当作对象的属性是不能用 . 点来链接的。
用索引读取,索引是从0开始的。数组也是对象,对对象对的某个属性进行访问,可以使用[]或者. 这两种方式。但是属性名称是数字体现的,所以就要使用[]的方式。
在JavaScript中通常使用”."运算符来存取对象的属性的值。或者使用[]作为一个关联数组来存取对象的属性。但是这两种方式有什么区别了?
使用数组[]表示法来存取一个对象的属性时,属性名是用字符串表示的。
所以我们要用[]作为对象属性的链接。那么也不用去把这些都一步步搞出来,我们就把obj[t]也就是obj[arr[i]],拿出来看看它的布尔类型。
for(vari=;i
vart=arr[i];
//打印每一个obj[t]
//console.log(obj[t]);
//1.undefined == false
//2.undefined == false
//3.undefined == false
//前三个都是false也就是说前三个都没有重复的
//4.true
//没有重复的是false,如果在判断中需要加!
//进入了判断语句,就给它一个属性值true
if(!obj[t]) {
obj[t] =true;
//1.
//2.
//3.
//把属性名给新数组push进去
newArr.push(t);
}
}
好了两种方法喜欢哪个都可以试试,下周我们介绍ES5和ES6的方法。但是大家要注意的是,按照需求去选择方法。如果我们需要兼容低版本浏览器,就不可以用新方法。
本微信号所有内容为前端客用户原创,前端客已获得独家授权,欢迎分享。
如有转载需求请留言征询,对于未经许可私自篡改内容、转载的行为我们保留追究维权的合法权利!
领取专属 10元无门槛券
私享最新 技术干货