我已经创建了一个实用函数,几乎在我编写的所有Javascript代码中都包含了该函数。所述功能的目的是简单地从数组中删除一个元素。它使用一个数组和一个索引作为参数,并返回删除了必需元素的数组。
功能如下:
sliceHere = function(array, i)
{
buffOne = array.slice(0, i);
buffTwo = array.slice(i + 1);
return buffOne.concat(buffTwo);
}
它工作正常。如果我有一个数组
a = ["a", "b", "c"]
,并且想从中删除"a"
,则只需执行a = sliceHere(a, 0);
。尽管这样做确实可行,但我想用更“优雅”的东西代替它。我想做的就是使函数
sliceHere
成为我拥有的所有数组的方法。因此,我可以简单地执行a.sliceHere(0)
并达到相同的效果。这只是一种更好的处理方式,如果我做错了,请纠正我。我所做的是:
sliceHere = function(i)
{
buffOne = this.slice(0, i);
buffTwo = this.slice(i + 1);
this = buffOne.concat(buffTwo);
}
Array.prototype.sliceHere = sliceHere
这似乎根本不起作用。因为我知道“ this”可能不是实际的数组。如何从方法内部引用数组?
最佳答案
为什么要重新发明轮子? Array.prototype.splice
已经做过同样的事情:
var array = [1, 2, 3];
var i = 1;
array.splice(i, 1);
array; // [2, 3]
好吧,让我们重新发明轮子:
带接头:
Array.prototype.sliceHere = function(i) {
this.splice(i, 1);
};
无接头:
Array.prototype.sliceHere = function(i) {
var i_want_you = this.slice(0, i).concat(this.slice(i + 1));
this.length = 0;
this.push.apply(this, i_want_you); // <-- Modifies all keys, indirectly
};
如果您不希望该方法出现在
for(.. in ..)
循环中,请使用Object.defineProperty(Array.prototype, 'sliceHere', {value: /*function here*/});
。