2016-07-14 11 views
0

req.user.hails[0]クラスのインスタンスが歓迎され、それは私がこのようにそれを呼び出す方法cancel() ありますアイテムの配列内のアイテムを削除しますか?

req.user.hails[0].cancel() 

私はそのインスタンス内からアイテム自体を削除できますか?

cancel: function() { 
     //this will remove the item from a databae 
     this.destroy() 
     //Here I want to delete "this". 
    } 

希望する結果は、req.user.hails.lengthが以前よりも短くなります。私はキャンセルしたい場所からそれを削除できることを知っています。

+2

いいえ、あなたはリストから削除する必要があります。 'cancel()'のコードは、それが何の配列であるかを知っていればそれを行うことができますが、それはほとんどの場合非常に壊れやすい設計になります。オブジェクトは、一般的に、自分自身への参照がどこにあるかを「知る」ことはできません。 – Pointy

+0

理想的には、 'cancel'はいくつかのステータスまたはフラグを設定し、このフラグを持たないすべての要素を使うべきです。 – Rajesh

答えて

0

いいえ、あなたはそれが(そうである)cancelreqreq.user、またはreq.user.hailsの上に閉じることが起こるない場合を除き、できません。 (それでは、それでもとなるでしょう)実際にはということはありません。そうでなければ、配列からエントリを削除するために使用できる情報はありません。あなたは、両方のキャンセルは、エントリを削除しないhailsに方法追加することができ

req.user.hails.cancelEntry = function(index) { 
    this[index].cancel(); 
    this.splice(index, 1); 
}; 

をはい、あなたは本当にそのような配列に非インデックスプロパティを追加することができます。配列をループするためにループを使用しない理由の1つは列挙可能であることに注意してください。 (this questionで配列し、その答えをループについての詳細。)

あなたはそれが非可算作ることができます:ES2015 +で

Object.defineProperty(req.user.hails, "cancelEntry", { 
    value: function(index) { 
     this[index].cancel(); 
     this.splice(index, 1); 
    } 
}); 

、あなたもそのプロトタイプにcancelEntryを持っていたArrayのサブクラスを作成することができます。..

関連する問題