2012-02-22 4 views
0

私は最近何かを見つけました。私はこのような配列からオブジェクトを削除する機能を追加したい:CoffeeScript拡張演算子 'this'を変更していますか?

someArray.remove(element) 

私はCoffeeScriptののextend演算子を使用したいと、それは次のようにします。

Array::remove = (element) -> 
    return false unless _.include(this, element) 
    this = this.splice(_.indexOf(this, element), 1) 
    true 

しかし、プロトタイプ機能、それはArrayオブジェクト自体にポイントthisを作成し、その唯一の方法は、次のようになり、何かを返すことですされています

someArray = someArray.remove(element) 

とこのようなことのための実装:Rubyで

Array::remove = (element) -> 
    return this unless _.include(this, element) 
    this.splice(_.indexOf(this, element), 1) 

これはjoinjoin!間の正確な違いです。

これを達成する方法はありますか?

答えて

2

spliceと間違えていると思います。それは配列自体で動作します。あなたができるので、CoffeeScriptのはindexOfためのシムが含まれていることを

_ = require "underscore" 

Array::remove = (element) -> 
    index = _.indexOf @, element 
    return false if index is -1 
    @splice index, 1 
    true 

foo = ["a", "b", "c"] 
console.log foo   # => ['a', 'b', 'c'] 
console.log foo.remove "b" # => true 
console.log foo   # => ['a', 'c'] 
console.log foo.remove "d" # => false 
console.log foo   # => ['a', 'c'] 

注ので、厳密には必要ありません下線:

Array::remove = (element) -> 
    index = @indexOf element 
    return false if index is -1 
    @splice index, 1 
    true 
+0

ありがとうございました!私はスプライスが配列を実際に変更していることを知らなかった。新しいコピーを返すだけだと思った。 –

1

私はそれを実装:

Array::remove = (element) -> 
    return false unless element in @ 
    @splice(@indexOf(element), 1) 
    true 

そして、それが正常に動作します。 this変数でどのような問題が発生しているのかよく分かりませんが、は元の配列を変更するので、割り当ては必要ありません。 CoffeeScriptではthisに割り当てることができないため、最初の実装は私のためにコンパイルされません。

+0

ありがとうございましたこれは、私は完全にあなたの質問を誤解しない限り、トリックを行うようです同様に、非常にエレガントなソリューション!すばらしいです! –

関連する問題