求一个javascript数组去重方法?

数组中包含数组,Object,undefined,null,function等等一系列复合类型,请问javascript怎么实现去重,代码最好精练些!…
关注者
184
被浏览
49,724

44 个回答

// ES6
function unique (arr) {
  const seen = new Map()
  return arr.filter((a) => !seen.has(a) && seen.set(a, 1))
}
// or
function unique (arr) {
  return Array.from(new Set(arr))
}

跑个分。

  var arr = [];
    var num = 0;
    for (var i = 0; i < 10000; i++) {
    	num = i%4;
    	if(num == 0)
        arr.push(Math.floor(Math.random() * 99999));
    	if(num == 1){
    		arr.push(function(){
    			var some = Math.random();
    		})
    	}
    	if(num == 2){
    		arr.push({
    			a:Math.random()
    		})
    	}
    	if(num == 3)
        	arr.push(Math.floor(Math.random() * 99999));
    }

    function deRepeat() {
        var myarr = arr;
            var startTime = (new Date()).valueOf();

            var len = myarr.length;
            var tmparr = [];
            var tmp = {};
            for (var i = 0; i < len; i++) {
                if (tmp[myarr[i]] == undefined) {
                    tmp[myarr[i]] = 1
                    tmparr.push(myarr[i])
                }
            }

            return (new Date()).valueOf() - startTime;

    }

    function unique(arr) {
        var startTime = (new Date()).valueOf();

        const seen = new Map()
        arr.filter((a) => !seen.has(a) && seen.set(a, 1))

        return (new Date()).valueOf() - startTime;
    }


    function uniq(array) {
        var startTime = (new Date()).valueOf();

        for (var i = array.length; i--;) {
            var n = array[i]
                // 先排除 即 如果它是清白的 后面就没有等值元素
            array.splice(i, 1, null)
            if (~array.indexOf(n)) {
                array.splice(i, 1); //不清白
            } else {
                array.splice(i, 1, n); //清白
            }
        }
        return (new Date()).valueOf() - startTime;
    }



    function cacl(arr, callback) {
        var ret;
        for (var i = 0; i < arr.length; i++) {
            ret = callback(arr[i], ret);
        }
        return ret;
    }

    Array.prototype.sum = function() {
        return cacl(this, function(item, sum) {
            if (typeof(sum) == 'undefined') {
                return item;
            } else {
                return sum += item;
            }
        });
    };

    Array.prototype.avg = function() {
        if (this.length == 0) {
            return 0;
        }
        return this.sum(this) / this.length;
    };


    function bench() {
        
        var c = [];
        var d = [];
        var e = [];
        for (var i = 0; i < 100; i++) {
            
            c.push(deRepeat(arr));
            d.push(unique(arr));
            e.push(uniq(arr));
        }
        console.log('origin:');
        console.log(c.avg());

        console.log('尤雨溪:');
        console.log(d.avg());

        console.log('郑海波:');
        console.log(e.avg());


    }
    bench()