次に例を示します。
const initObject = {
a: 0,
b: 0,
c: 0
}
const { a, ...rest } = initObject
オブジェクトからプロパティa
を省略していますが、const a
には値が割り当てられていますが、使用されていません-eslintからのエラー(no-unused-vars)。 const a
を完全に省略することはできますか?
可能な方法は// eslint-disable-next-line no-unused-vars
を使用することです
例えば.
// eslint-disable-next-line no-unused-vars
const { a, ...rest } = initObject
または ignoreRestSiblings
を使用する
IgnoreRestSiblingsオプションはブール値です(デフォルト:false)。 Restプロパティを使用すると、オブジェクトからプロパティを「省略する」ことができますが、デフォルトでは兄弟のプロパティは「未使用」としてマークされます。このオプションを有効にすると、残りのプロパティの兄弟は無視されます。
例えば.
/*eslint no-unused-vars: ["error", { "ignoreRestSiblings": true }]*/
// 'a' is ignored because it has a rest property sibling.
const { a, ...rest } = initObject;
no-unused-vars
に関する詳細情報
ただし、a
プロパティを削除することが目的の場合は、別の方法があります。delete
演算子を使用できます。
から MDNドキュメント
JavaScript
delete
operatorは、プロパティをオブジェクト
例えば.
const initObject = {
a: 0,
b: 0,
c: 0
}
const rest = { ...initObject }; // create a shallow copy
delete rest.a;
console.log(rest);
これは @ R3tepの答え からの些細な逸脱のように見えるかもしれませんが、宣言内のすべての変数を使用済みとしてマークするという落とし穴を回避します。
_const initObject = {
a: 0,
b: 0,
c: 0
}
const {
a, // eslint-disable-line no-unused-vars
...rest
} = initObject
_
rest
が未使用の場合でも、eslintエラーが発生します。
質問に関して
プロパティを削除する正しい方法は何ですか?
代わりに、あなたが尋ねるべきだった質問に答えます。 不要なプロパティを持つオブジェクトを処理する正しい方法は、暗黙的にそれらを無視するようにロジックを書き直すことです。
プロパティb
およびc
だけが必要な場合は、それらのプロパティのみを分解します。
_const { b, c } = initObject
_
a
が必要ない場合は、それが存在することさえ認めないでください。
入力に特定のプロパティがたくさんあり、処理する必要があり、initObject
にすでにexact必要なレイアウト、次にavoidリフレクションメソッドまたは構文 Object.entries()
のような構文を使用する誘惑 、 _for...in
_ 、 object spread and rest syntax など.
必要な特定のプロパティを個別に処理し続け、必要に応じてロジックを分離可能な関数に分割し、それぞれが管理可能なプロパティのサブセットを処理します。
一方、can入力を事前調整して、すでに必要な正確なレイアウトにすることができます(たとえば、initObject
はb
とc
)の場合は、自由にリフレクションを使用してください。これがまさにそのためです。
上記の2つの点のどちらにも当てはまらず、initObject
に多くのarbitraryプロパティを本当に必要とする場合は、無視したいものの場合この回答(または他の回答の1つ)の先頭にある提案を使用してください。
ただし、前述のように、これはコードの匂いであり、オブジェクトのレイアウトにロジックをより寛容にする必要があることを示しています1、または入力の前提条件を変更する必要があります2。
eslintからのエラー(no-unused-vars)。
no-unused-vars rules には、ユースケースに役立つ2つの構成オプションがあります。
ignoreRestSiblings
オプション は、デフォルトでfalse
になるブール値です。有効にすると、残りのプロパティの兄弟は無視されます。これは正確に必要なものです!varsIgnorePattern
オプション は、使用法についてチェックされない変数名の正規表現パターンを指定します。これにより、 commonnderscore identifier の例外を作成して、未使用の変数を明示的に{ "varsIgnorePattern": "^_" }
でマークできます。
const { a:_, ...rest } = initObject;
// ^^
残念ながら、_
変数の複数の宣言を回避する必要があるため、複数のプロパティを省略するには、{ a:_a, b:_b, ...rest } = …
のようなことを行う必要があります。
const a
を完全に省略することはできますか?
識別子の導入を完全に回避する悪いハックは、
const { a:{}, ...rest } = initObject;
// ^^^
これにより、.a
プロパティ値がさらにオブジェクトに分解されますが、そのためには、プロパティが存在し、null
またはundefined
値を保持していないことを確認する必要があります。
IIFEを作成してオブジェクトを渡すことができます。
const initObject = {
a: 0,
b: 0,
c: 0
}
const res = (({a,...rest}) => (a,rest))(initObject);
console.log(res)
技術的にがリンター規則を満たすオプションは、rest
を事前に宣言し、a
プロパティをrest
に分解して、その後 REST構文を使用して、オブジェクトの残りをrest
変数名に入れます。
const initObject = {
a: 0,
b: 0,
c: 0
};
let rest;
({ a: rest, ...rest } = initObject);
console.log(rest);
残念ながら、var
を避けたい場合は、次のように1行で行うことはできません。
let { a: rest, ...rest } = initObject
{
の左側で変数を宣言すると、右側の新しい変数名はそれぞれinitializedになります。つまり、インタプリタからは次のようになります。
let rest = initObject.a;
let rest = <everything else in initObject>
ただし、同じ変数名に重複するlet
識別子を使用することはできません。あなたはcouldvar
を使用して1行で実行します。重複した識別子は許可されます。
const initObject = {
a: 0,
b: 0,
c: 0
};
var { a: rest, ...rest } = initObject;
console.log(rest);
しかし、これはすべて少し奇妙です。他の回答が示唆しているように、私はリンターを設定/無視するか、または破壊以外の何かを使用したいと思います。
試す
const rest = ((o)=> (delete o.a,o))({...initObject});
'use strict'
const initObject = {
a: 0,
b: 0,
c: 0
}
const rest = ((o)=> (delete o.a,o))({...initObject});
console.log({initObject,rest});
Object.assign()
を使用してオブジェクトの浅いコピーを作成し、プロパティを削除できます。
const initObject = {
a: 0,
b: 0,
c: 0
}
let rest = Object.assign({}, initObject);
delete rest.a;
console.log(rest);
console.log(initObject);