1

私が作成するほとんどすべてのJavascriptコードに含めるユーティリティ関数を作成しました。上記の関数の目的は、配列から1つの要素を削除することです。引数として配列とインデックスを取り、必要な要素が削除された配列を返します。

関数は次のとおりです。

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

これはまったく機能しないようでした。「これ」はおそらく実際の配列ではないことを私は知っていたからです。メソッド内から配列を参照するにはどうすればよいですか?

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 に答える