使用原型

时间:2017-10-10 11:45:40

标签: javascript arrays return-value in-place

我已经创建了一个自定义原型来清理数组,以便删除重复项排序它。它起作用,看起来像这样:

 // 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()可以,但不是自定义函数?

1 个答案:

答案 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 循环。