数组的去重问题

//**************** 数组去重的几种方法****************/
//参考: http://php.js.cn/blog/array-unique-in-javascript/#comment2665
// http://segmentfault.com/q/1010000000197274
//方法一:用indexOf()查找,indexOf()只支持ie9+
//而且性能不好,js引擎需要反复找多次
function unique1(src){
    var result = [];
    for (var i = 0; i < src.length; i++){
        // 看能不能找到
        if (result.indexOf(src[i]) == -1) {
            result.push(src[i]);
        }
    }
    return result;
}
console.log(unique1([1, 3, 5, 7, 5, 3]));
console.log(unique1(['e','a','r','a']));

//方法2: hash表,兼容性良好
console.log('方法2: hash表,兼容性良好');
Array.prototype.unique2 = function(){
    var h = {},
        result = [];
        for (var i = 0; i < this.length; i++){
            // 看flag是否存在,若不存在,则hash,且压栈
            if (!h[this[i]]) {
                result.push(this[i]);
                h[this[i]] = true;
            }
        }
        console.log(h);
        return result;
}
console.log([1, 3, 5, 7, 5, 3,3].unique2());
console.log(['e','a','r','a'].unique2());

第二种方法有个局限,就是作为下标会被转换为字符串,这样1, ‘1’等不同类型的值会对应到同一个下标而被去重,但实际应该保留。

把 hash 表的值从 true 改为一个数组,里面保存出现过的类型就行了。

Array.prototype.unique = function()
{
var n = {}, r = [], len = this.length, val, type;
for (var i = 0; i < this.length; i++) {
val = this[i];
type = typeof val;
if (!n[val]) {
n[val] = [type];
r.push(val);
} else if (n[val].indexOf(type) < 0) {
n[val].push(type);
r.push(val);
}
}
return r;
}

// 数组去重
function uniqArray (arr) {
var obj = {};
var r = [];
for (var i = 0; i < arr.length; i++) {
obj[arr[i]] = typeof arr[i];
}
for (var i in obj) {
if (obj[i] === “number”) {
r.push(Number(i));
continue;
}
r.push(i);
}
return r;
}

var a = [1,3,2,1,2,”bb”,”cc”,”bb”];

// 数组去重 2
function uniqArray (arr) {
var r = [];

for (var i = 0; i < arr.length; i++) {
    if (r.indexOf(arr[i]) === -1) {
        r.push(arr[i]);
    }
}
return r;

}

var a = [1,3,2,1,2,”bb”,”cc”,”bb”];

// 数组去重 3
function uniqArray (arr) {
var r = [];
for (var i = 0; i < arr.length; i++) {
var common = false;

    for (var j = 0; j < r.length; j++) {
        if (arr[i] === r[j]) {
            common = true;
        }
    }
    if (!common) {
        r.push(arr[i]);
    }
}
return r;

}

var a = [1,3,2,1,2,”bb”,”cc”,”bb”];

// 数组去重 4
function uniqArray(arr) {
var obj = {},
r = [],
len = arr.length,
type,
val;

for (var i = 0; i < len; i++) {
    val = arr[i];
    type = typeof val;
    if (!obj[val]) {
        r.push(val);
        obj[val] = [type];
    } else if (obj[val].indexOf(type) < 0) {
        // 若类型不同,则push
        r.push(val);
        obj[val].push(type);
    }
}
return r;

}

var a = [1,3,2,1,2,”bb”,”cc”,”bb”];

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值