使用对象分解时忽略属性变量

Ale*_*Kim 20 javascript ecmascript-6 eslint object-destructuring

这是一个例子:

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

const { a, ...rest } = initObject
Run Code Online (Sandbox Code Playgroud)

我们a从对象中省略属性,但随后const a为它分配了一个值,但从未使用过-eslint(无未使用的变量)产生错误。是否可以完全省略const a

Ber*_*rgi 15

来自 eslint 的错误(no-unused-vars)。

无未使用-瓦尔规则有两种配置选择,将与你的使用情况有所帮助:

  • ignoreRestSiblings选项是一个布尔值,默认为false。启用后,其余属性的同级将被忽略。这正是您所需要的!
  • varsIgnorePattern选项指定不检查使用情况的变量名称的正则表达式模式。这允许我们对常见的 下划线标识符进行例外处理,以使用 显式标记未使用的变量{ "varsIgnorePattern": "^_" }

    const { a:_, ...rest } = initObject;
    //       ^^
    
    Run Code Online (Sandbox Code Playgroud)

    不幸的是,您仍然需要避免_变量的多个声明,因此要省略多个属性,您需要执行类似{ a:_a, b:_b, ...rest } = ….

可以完全省略const a吗?

一个完全避免引入任何标识符的坏黑客是使用

const { a:{}, ...rest } = initObject;
//       ^^^
Run Code Online (Sandbox Code Playgroud)

这进一步将.a属性值解构为一个对象,但为此您需要确保该属性存在并且不包含nullundefined值。


R3t*_*tep 14

一种可能的方法是使用 // eslint-disable-next-line no-unused-vars

例如

// eslint-disable-next-line no-unused-vars
const { a, ...rest } = initObject
Run Code Online (Sandbox Code Playgroud)

或使用 ignoreRestSiblings

ignoreRestSiblings选项是一个布尔值(默认值:false)。使用Rest属性可以从对象中“忽略”属性,但是默认情况下,同级属性被标记为“未使用”。启用此选项后,将忽略rest属性的同级。

例如

/*eslint no-unused-vars: ["error", { "ignoreRestSiblings": true }]*/
// 'a' is ignored because it has a rest property sibling.
const { a, ...rest } = initObject;
Run Code Online (Sandbox Code Playgroud)

有关更多信息 no-unused-vars


但是,如果您的目标是删除该属性a,则还有另一种方法。
您可以使用delete运算符。

来自MDN文档

JavaScript 运算符从对象中删除属性delete

例如

// eslint-disable-next-line no-unused-vars
const { a, ...rest } = initObject
Run Code Online (Sandbox Code Playgroud)

  • @AlexanderKim这是我的正确方法 (4认同)
  • @AlexanderKim 因为它们不同。如果你引用 `initObject` 而不是创建一个浅拷贝,`delete rest.a` 也会修改 `initObject`。 (3认同)
  • 谢谢,但我不想禁用警告,我想“以正确的方式”做到这一点:) (2认同)

Pat*_*rts 7

这似乎与@ R3tep的答案有微不足道的偏离,但它避免了将声明中的所有变量标记为使用的陷阱:

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

const {
  a, // eslint-disable-line no-unused-vars
  ...rest
} = initObject
Run Code Online (Sandbox Code Playgroud)

现在,如果rest未使用它,仍然会导致eslint错误。


关于这个问题

那么删除属性的正确方法是什么?

我将回答您应该问的问题。处理不需要的属性的正确方法是用隐式忽略它们的方式重写逻辑。

  1. 如果只需要属性bc,则仅对那些属性进行解构:

    const { b, c } = initObject
    
    Run Code Online (Sandbox Code Playgroud)

    a如果您不需要它,甚至不要承认它的存在。

  2. 如果输入有很多具体的你需要处理的属性,也不能假设initObject已经有确切需要的布局,然后避免诱惑,利用反射的方法或类似语法Object.entries()for...in对象蔓延和休息语法等。

    继续单独处理所需的特定属性,并在必要时将逻辑分解为可分离的函数,每个函数处理属性的可管理子集。

    另一方面,如果您可以对输入进行预处理,以使其具有已经需要的确切布局(例如,您可以假定initObject仅具有band c),则可以随意使用反射-正是它的用途。

  3. 如果以上两点都不适合您,并且您仍然发现您确实想initObject拥有许多任意属性,而又有一些您想忽略的属性,那么您应该在此答案的开头使用建议(或一个)其他适合您的答案)。

    但是,如上所述,这是代码气味,它指示您的逻辑需要对对象1的布局更为宽大,或者输入的前提条件需要更改2

  • @AlexanderKim性能成本是毫无价值的,直到它们1)成为一个问题,以及2)您已经配置好以确保您的性能瓶颈在哪里。优化1毫秒和4个字节并不能帮助您100%使用JavaScript的用例。 (5认同)
  • @Delioth 1ms很多。在这里,我们谈论的是1 /100μs或更小。您的观点更好。 (2认同)