数组去重
题目来自于自己真实笔试,现在总结到博文,算是给自己的再一次复习吧,另外也可以与大家分享。
最初的实现
我记得我第一次的答案是这样写的:
for (var i = 0; i < arr1.length; i++) {
for (var j = i+1; j < arr1.length; j++) { // 从第i+1个元素遍历数组
// 如果当前数组元素相同
if (arr1[i] == arr1[j]) {
arr2.push(arr1[j]); // 把相同的元素push到数组arr2中
arr1.splice(j,1); // 并删除更新原数组arr1
}
}
}
然后测试是这样:
var arr1 = [1,2,3,4,2,5,6,1,7,8,4];
var arr2 = [];
//测试
document.write('去重数组:' + arr1 + " 重复项:" + arr2);
//结果: 去重数组:1,2,3,4,5,6,7,8 重复项:1,2,4
虽然思想结果都是对的,但是我当时真的只是为作答而作答,并没有想着去完善一个去重的功能,去分析它的性能。后来学习到原型prototype这个知识点,然后改进了下方法。将方法写在数组的原型上,这样就可以直接调用去重方法,实习去重,另外也会去在写每一个方法时去考虑它的性能。
去重方法1:
/**
* [unique1 数组去重方法1]
*
* 利用array indexOf
* @return {[Array]} [去重后的数组]
*/
Array.prototype.unique1 = function()
{
var temp = []; // 一个新的临时数组
for(var i = 0; i < this.length; i++) // 遍历当前数组
{
//判断是否临时数组中有该遍历的元素存在
if (temp.indexOf(this[i]) == -1) {
temp.push(this[i]); // 若不存在,则push到临时数组里面
}
}
return n;
}
去重方法2:
/**
* [unique2 数组去重方法2]
*
* 利用array indexOf
* @return {[Array]} [去重后的数组]
*/
Array.prototype.unique2 = function()
{
var temp = [this[0]]; // 把数组首个元素存入临时数组
for(var i = 1; i < this.length; i++) //从数组元素第2个开始遍历
{
//判断第i项元素是否在临时数组中第一次出现的位置是i,
if (this.indexOf(this[i]) == i) { // 如果不是i,表示是重复项
n.push(this[i]); // 如果是i,就push元素到临时数组中
}
}
return n;
}
去重方法3:
/**
* [unique3 数组去重方法3]
*
* 利用array sort方法先排序
* @return {[Array]} [去重后的数组]
*/
Array.prototype.unique1 = function() {
this.sort(); // 进行基础排序
var temp = [this[0]]; // 将数组第1个元素存入临时数组中
for(var i = 1; i < this.length; i ++) { // 从数组第2个元素遍历数组
// 判断遍历的元素和临时数组最后一个元素是否相同,
if (this[i] !== temp[temp.length-1]) {
temp.push(this[i]); // 如果不相同,那就push到临时数组
}
}
return temp; // 返回临时数组
}
测试:
var arr = [1,2,3,4,2,5,6,1,7,8,4];
// 方法1
document.write('去重数组:' + arr.unique1()); // 去重数组:1,2,3,4,5,6,7,8
// 方法2
document.write('去重数组:' + arr.unique2()); // 去重数组:1,2,3,4,5,6,7,8
// 方法2
document.write('去重数组:' + arr.unique3()); // 去重数组:1,2,3,4,5,6,7,8
结果都是一样的,但是从性能来说,第三种方法效率要高于前两种,因为前两种方法使用的indexOf(),要去把整个数组所有元素搜索一遍,如果遇到很长的数组,效率可想而知很不理想,而第三种是先进行基础排序,然后再去比较两个元素,不需要把整个数组搜索一遍,所以执行效率要更好。
当然数组去重的方法很多,我只是举例出其中的三个,很乐意其他朋友分享交流指正
咳咳,还是那句话
还是要不断学习的,因为自己还很年轻