removeDuplicates无法按预期工作

时间:2016-06-24 08:59:13

标签: javascript arrays

我正在尝试使用以下函数扩展Array原型:

Array.prototype.uniqueItems=function(){
    var ar=this,unique=[],max=ar.length;
    for(var i = 0 ; i < max;i++)
        if(unique.indexOf(ar[i] )==-1)
            unique.push(ar[i]);
    return unique;  
};
Array.prototype.removeDuplicates=function(){
    var self = this;
    self = this.uniqueItems();
    return self;
};

第一个函数应该返回一个没有重复的数组,第二个函数用于删除给定数组中的所有重复项。 请考虑以下代码:

var x=[1,1,1,1,2,2,2,2,3,3,3,3,4,4];
x.removeDuplicates();
console.log(x);

输出是:     [1,1,1,1,2,2,2,3,3,3,3,3,4,4] 所以重复仍然存在。任何想法为什么?提前感谢!!!!另请注意我不能使用x= x.uniqueItems(),因为它只适用于x.I希望它适用于任何给定的数组。

5 个答案:

答案 0 :(得分:1)

你可以在ES6中这样做。

var x = [1,1,1,1,2,2,2,2,3,3,3,3,4,4],
    u = a => Array.from(new Set(a)),
    y = u(x);
console.log(y);

ES6中的新Set object获取元素并仅保留其中一个并丢弃欺骗。所以这是获得独特物品的理想方式。 Set构造函数即时创建一个新的set对象,它将接受一个项目数组作为参数,例如在var s = new Set([1,1,2,1,4,3,6,7,4,5,6,9,8,1,2,3,4,7,0])中,生成的s集合将由1,2,4的唯一条目组成,3,6,7,5,9,8和0的出现顺序。 Set对象具有生成器属性和迭代器函数,可以从中获取它们。因此[...s](ES6传播运算符)或Array.from(s)会自动生成一个正确的唯一项数组。

答案 1 :(得分:1)

Array转换为Set并将其转换为可以说是更清晰的实现:

Array.prototype.uniqueItems = function() {
    return new Array.from(new Set(this));
};

Array.prototype.removeDuplicates = function() {
    this.from(new Set(this));
};

答案 2 :(得分:0)

重新分配给x。

to_proc

答案 3 :(得分:0)

当你说

self = this.uniqueItems();

self现在指向一个新数组,而不是this

你需要做

x = x.removeDuplicates();

或在this中再次重复removeDuplicates以删除其他项目。

例如

Array.prototype.removeDuplicates=function(){
    var self = this;
    var that = this;
    self = this.uniqueItems();
    //remove all items
    for(var counter = that.length ; counter >= 0; counter -- )
    {
      that.splice(counter,1);
    }
    //copy the individual items to this
    Object.keys(self).forEach(function(index){
      that[index] = self[index]
    });
    return self;
};

答案 4 :(得分:0)

嘿,谢谢大家的答案。我通过以下方式找到了解决问题的简单方法:

Array.prototype.removeDuplicates=function(){
    //First create a copy of the current array without duplicates
    var clear_array=this.uniqueItems();
    //Delete every item in the current array
    this.length=0;
    //Fill the current array with the elements of clear_array
    for(var i = 0;i<clear_array.length;i++)
        this[i] = clear_array[i];
    return this;
};

此外,我没有使用Set,因为我想确保向后兼容性 希望这对某人有帮助:))