我已经创建了一个自定义原型来清理数组,以便删除重复项和排序它。它起作用,看起来像这样:
// given an example array such as this.
var names = [ 'Lara', 'Lucy', 'Alexa', 'Vanessa', 'Lucy', 'Brianna', 'Sandra' ];
Array.prototype.clean_up = function(){
var
set = []
;
this.forEach(function(item){
if ( set.indexOf(item) === -1 ) {
set.push(item);
}
});
set.sort();
return set;
};
我唯一的抱怨是我必须这样称呼它:
names = names.clean_up();
如果我可以按照后面的说法调用它,我会更喜欢它,例如Array.sort()
(我相信这称为就地实现)。你怎么能这样做?
names.clean_up();
编辑:(显然,这属于这里而不是答案)
我目前的解决方案如下所示,但感觉有点无效。我想知道是否可以做得更好。
Array.prototype.clean_up = function(){
var
set = [],
self = this
;
this.forEach(function(item){
if ( set.indexOf(item) === -1 ) {
set.push(item);
}
});
set.sort();
// reset and re-fill.
while (this.length > 0) {
this.pop();
}
set.forEach(function(item){
self.push(item);
});
};
对一个人和另一个人无效:已经多次mentioned,你不应该修改原始数组。那是为什么?
我的意思是,如果有一个像Array.sort()
这样的函数,那么它表明该语言能够做到这一点,并且某些实现似乎“没问题”?为什么sort()
可以,但不是自定义函数?
答案 0 :(得分:0)
如果要在适当的位置影响数组,则应该从数组中查找重复项并拼接它们。 Array.prototype.indexOf可与第二个参数一起使用,以从当前元素中搜索并删除欺骗,例如
Array.prototype.clean = function (){
// Iterate backwards over array
this.reduceRight(function(acc, value, index, arr) {
// If first index of value isn't current index, remove this element
if (arr.indexOf(value) != index) arr.splice(index, 1);
}, null);
// Now sort
this.sort();
// Return for chaining
return this;
}
var arr = 'aztatffgff'.split('');
console.log(arr.join());
console.log(arr.clean().join());

在数组上向前迭代不起作用,因为当元素被拼接时,元素被混洗,因此跳过下一个元素。您也不能仅使用过滤器创建数组,因为您无法将该新数组分配给 this 。
reduceRight 可以替换为 for 循环。