如何就地替换数组元素

Posted

技术标签:

【中文标题】如何就地替换数组元素【英文标题】:How to replace array elements in place 【发布时间】:2016-09-16 14:41:37 【问题描述】:

我想为 Array.prototype 附加一个新方法:

Array.prototype.uniq = function()
  return this.filter((val, index) => 
    return this.indexOf(val) === index;
  );
;

var a = [1, 1, 2, 3];
console.log(a.uniq()); // output: [1,2,3]
console.log(a); // output: [1,1,2,3]

该方法从数组中删除重复项。我遇到的问题是,每当调用uniq 时,都会返回一个新数组。我想做这样的事情:

Array.prototype.uniq = function()
  this = this.filter((val, index) =>   // "ReferenceError: Invalid left-hand side in assignment
    return this.indexOf(val) === index;
  );
;

这样:

var a = [1, 1, 2, 3];
a.uniq();
console.log(a); // output: [1,2,3]

我该怎么办?

【问题讨论】:

为什么不直接做a = a.uniq() @Schleis 确定可行,但我只是好奇如何在原型中做到这一点 How to replace elements in array with elements of another array 【参考方案1】:

您可以使用for 循环遍历数组,如果索引不同则使用splice

Array.prototype.uniq = function () 
    // Reverse iterate
    for (var i = this.length - 1; i >= 0; i--) 

        // If duplicate
        if (this.indexOf(this[i]) !== i) 
            // Remove from array
            this.splice(i, 1);
        
    

    // Return updated array
    return this;
;

var a = [1, 1, 2, 3];
a.uniq();
console.log(a); // output: [1,2,3]

【讨论】:

谢谢!我考虑过拼接,但是当我从数组中删除元素时,索引会发生变化。反向迭代非常聪明:) return this 行不需要吧? Tushar,for 循环内的索引不应该是i-1,因为i = this.length 会使this[i] 脱离循环。

以上是关于如何就地替换数组元素的主要内容,如果未能解决你的问题,请参考以下文章

关于数组中的就地合并

如何在不添加新数组的情况下移除元素?

从原始数据就地创建 std::vector

最佳就地额外宽度杀死布局

如何使用字典来翻译/替换数组的元素? [复制]

labview如何对数组中的任意一个元素进行替换