JavaScriptオブジェクトからプロパティを削除するにはどうすればいいですか?
以下のようにオブジェクトを作成するとします。
var myObject = {
"ircEvent": "PRIVMSG",
"method": "newURI",
"regex": "^http://.*"
};
プロパティ regex
を削除して、次のように新しい myObject
を作成するには、どのようにすればよいでしょうか。
var myObject = {
"ircEvent": "PRIVMSG",
"method": "newURI"
};
5780
3
こんな感じで。
デモ
もっと詳しく知りたい方は、Stack Overflowのユーザーであるkangaxさんが、ご自身のブログ「Understanding delete」で、
delete
文について驚くほど詳細なブログ記事を書いています。これはとてもお勧めです。。
これは、FirefoxとInternet Explorerで動作し、他のすべての環境でも動作すると思います。
Update 2018-07-21: 長い間、この回答を恥ずかしいと思っていたので、そろそろ少し触ってみようと思います。この回答の無駄に長くて複雑な部分を読みやすくするために、ちょっとした解説や説明、フォーマットをしてみました。
# ♪短いバージョン # 実際の質問への回答 他の人が言っているように、`delete`を使うことができます。
配列と同等
配列から
delete
を使ってはいけません。代わりにArray.prototype.splice
を使用してください。# 長いバージョン JavaScriptはOOP言語なので、*配列*を含めてすべてがオブジェクトになります。そのため、特に注意点を指摘する必要があると感じています。 配列では、通常のオブジェクトとは異なり、`delete`を使用すると、`null`という形でゴミが残り、配列に「穴」ができてしまいます。
ご覧のとおり、
delete
は必ずしも期待通りには動作しません。値は上書きされますが、メモリは再割り当てされません。つまり、array[4]
がarray[3]
に再配置されることはありません。これはArray.prototype.unshift
とは対照的です。Array.prototype.unshift
は配列の先頭に要素を挿入し、すべてをシフトアップします(array[0]
がarray[1]
になるなど)。 正直なところ、undefined
ではなくnull
に設定すること(これは本当に奇妙なことです)を除けば、この動作は驚くべきことではありません。なぜなら、delete
はtypeof
のような単項演算子で、言語にハードボイルドに組み込まれており、使用されるオブジェクトのタイプを気にしないことになっているのに対し、Array
はObject
のサブクラスで、配列を扱うために特別に設計された*メソッドを持っているからです。ですから、delete
に配列を再シフトするための特別なケースを用意する正当な理由はありませんし、それは無駄な作業で物事を遅らせるだけです。振り返ってみると、私の期待は現実的ではありませんでした。 もちろん、それは私を驚かせました。なぜなら、私は「null garbage」に対する私の聖戦を正当化するためにこのように書いたからです。これで、PDP-11さんを喜ばせることができました。ばんざーい!(それでも私は彼を諭しますが...)。
Array.prototype.splice vs Array.prototype.slice
この2つの似たような名前の関数の違いを指摘することは重要だと思います。
Array.prototype.splice(start, n)
.splice()
は、配列を変異させ、削除したインデックスを返します。配列はインデックス
startから始まり、
n個の要素が切り取られます。n が指定されていない場合は、
start以降の配列全体がスライスされます (
n = array.length - start`)。Array.prototype.slice(start, end)
.slice()
は非破壊で、
startから
endまでの指示されたインデックスを含む新しい配列を返します。end
が指定されていない場合は、.splice()
(end = array.length
) と同じ動作になります。なぜかend
は0ではなく1からインデックスを作成するので、この動作は少しトリッキーです。また、`end