1

我创建了一个实用函数,我编写的几乎所有 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”可能不是实际的数组。如何从方法内部引用数组?

4

2 回答 2

8

为什么要重新发明轮子?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*/});.

于 2012-06-15T21:02:49.203 回答
2

this始终是只读的,因此您不能为其分配新数组,您应该返回一个更新的值。这是您的示例的更新版本:

sliceHere = function(i)
{
    buffOne = this.slice(0, i);
    buffTwo = this.slice(i + 1);

    return buffOne.concat(buffTwo);
}

Array.prototype.sliceHere = sliceHere;

var arr = [1, 2, 3];
arr = arr.sliceHere(1);
于 2012-06-15T21:02:27.713 回答