web-dev-qa-db-ja.com

オブジェクトの分解を使用する場合はプロパティ変数を省略

次に例を示します。

const initObject = {
  a: 0,
  b: 0,
  c: 0
}

const { a, ...rest } = initObject

オブジェクトからプロパティaを省略していますが、const aには値が割り当てられていますが、使用されていません-eslintからのエラー(no-unused-vars)。 const aを完全に省略することはできますか?

22
Alexander Kim

可能な方法は// 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ドキュメント

JavaScriptdeleteoperatorは、プロパティをオブジェクト

例えば.

const initObject = {
  a: 0,
  b: 0,
  c: 0
}

const rest = { ...initObject }; // create a shallow copy
delete rest.a;

console.log(rest);
15
R3tep

これは @ R3tepの答え からの些細な逸脱のように見えるかもしれませんが、宣言内のすべての変数を使用済みとしてマークするという落とし穴を回避します。

_const initObject = {
  a: 0,
  b: 0,
  c: 0
}

const {
  a, // eslint-disable-line no-unused-vars
  ...rest
} = initObject
_

restが未使用の場合でも、eslintエラーが発生します。


質問に関して

プロパティを削除する正しい方法は何ですか?

代わりに、あなたが尋ねるべきだった質問に答えます。 不要なプロパティを持つオブジェクトを処理する正しい方法は、暗黙的にそれらを無視するようにロジックを書き直すことです。

  1. プロパティbおよびcだけが必要な場合は、それらのプロパティのみを分解します。

    _const { b, c } = initObject
    _

    aが必要ない場合は、それが存在することさえ認めないでください。

  2. 入力に特定のプロパティがたくさんあり、処理する必要があり、initObjectにすでにexact必要なレイアウト、次にavoidリフレクションメソッドまたは構文 Object.entries()のような構文を使用する誘惑_for...in_object spread and rest syntax など.

    必要な特定のプロパティを個別に処理し続け、必要に応じてロジックを分離可能な関数に分割し、それぞれが管理可能なプロパティのサブセットを処理します。

    一方、can入力を事前調整して、すでに必要な正確なレイアウトにすることができます(たとえば、initObjectbc)の場合は、自由にリフレクションを使用してください。これがまさにそのためです。

  3. 上記の2つの点のどちらにも当てはまらず、initObjectに多くのarbitraryプロパティを本当に必要とする場合は、無視したいものの場合この回答(または他の回答の1つ)の先頭にある提案を使用してください。

    ただし、前述のように、これはコードの匂いであり、オブジェクトのレイアウトにロジックをより寛容にする必要があることを示しています1、または入力の前提条件を変更する必要があります2

8
Patrick Roberts

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値を保持していないことを確認する必要があります。

5
Bergi

IIFEを作成してオブジェクトを渡すことができます。

const initObject = {
  a: 0,
  b: 0,
  c: 0
}
const res = (({a,...rest}) => (a,rest))(initObject);
console.log(res)
3
Maheer Ali

技術的にがリンター規則を満たすオプションは、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);

しかし、これはすべて少し奇妙です。他の回答が示唆しているように、私はリンターを設定/無視するか、または破壊以外の何かを使用したいと思います。

2

試す

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});
1

Object.assign()を使用してオブジェクトの浅いコピーを作成し、プロパティを削除できます。

const initObject = {
  a: 0,
  b: 0,
  c: 0
}

let rest = Object.assign({}, initObject);
delete rest.a;

console.log(rest);
console.log(initObject);
1
amrender singh