我正在尝试使用以下函数扩展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希望它适用于任何给定的数组。
答案 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,因为我想确保向后兼容性 希望这对某人有帮助:))