如何就地替换数组元素
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]
脱离循环。以上是关于如何就地替换数组元素的主要内容,如果未能解决你的问题,请参考以下文章