web-dev-qa-db-ja.com

JavaScript-オブジェクトから特定のプロパティを削除するための構文を広げて残ります

私は次のようなオブジェクトを持っています:

_let obj = {foo: 1, bar: 2, baz: 3}
_

削除するプロパティの名前をパラメータとして受け取るメソッドを呼び出して、特定のプロパティを削除したい

_removeProperty(obj, propertyName) {
  let { propertyName, _, ...result } = obj
  return result
}
_

問題は、このメソッドは、プロパティの名前を構文speadに直接書き込む場合にのみ機能することです。たとえば、_let { bar, _, ...result } = obj_です。ただし、構文speadがそれを新しい変数

lodashのomitを除いて、可能であれば別の解決策を使用して、それをどのように行うことができますか

11
Mouad Ennaciri

計算されたプロパティを破壊に使用できます。

let obj = {foo: 1, bar: 2, baz: 3}
function removeProperty(obj, propertyName) {
  let { [propertyName]: _, ...result } = obj
  return result
}
console.log(removeProperty(obj, 'foo'));

これにより、値propertyNameの名前のプロパティが使い捨て変数に割り当てられ、基本的にそのキーが削除されます。 MDNドキュメント を参照してください。

25
Andrew Li

destructuringのもう1つの代替方法は、deleteを使用することです。次のソリューションは、時間の複雑さをdestructuring(デスクトップChromeの場合)と比較して約35%削減します

解決

let obj = {foo: 1, bar: 2, baz: 3}
function removeProperty(obj, propertyName) {
  let newObj = {...obj};
  delete newObj[propertyName];
  return newObj;
}
console.log(removeProperty(obj, 'foo'));

性能試験

https://jsperf.com/so53753276

結果は、使用するブラウザによって異なります。結果はかなり興味深いものです。デスクトップSafari destructuringdeleteより優れていますが、デスクトップChrome outはデスクトップSafariのすべての数値を実行します。

+-----------------------------------+
| Browser | delete    | destructure |
+---------+-----------+-------------+
| Chrome  | 3,229,791 | 1,993,256   |
| Safari  | 1,186,679 | 1,872,396   | 
+---------+-----------+-------------+

Chrome=は実際のところSafariなので、iOSでの結果はそれほど驚くべきことではありません。

+-----------------------------------+
| Browser | delete    | destructure |
+---------+-----------+-------------+
| Chrome  | 1,146,496 | 1,785,551   |
| Safari  | 1,182,067 | 1,793,772   | 
+---------+-----------+-------------+

ドキュメンテーション

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete

6
AnonymousSB