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属性值解构为一个对象,但为此您需要确保该属性存在并且不包含null或undefined值。
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选项是一个布尔值(默认值: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)
这似乎与@ 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错误。
关于这个问题
那么删除属性的正确方法是什么?
我将回答您应该问的问题。处理不需要的属性的正确方法是用隐式忽略它们的方式重写逻辑。
如果只需要属性b和c,则仅对那些属性进行解构:
const { b, c } = initObject
Run Code Online (Sandbox Code Playgroud)
a如果您不需要它,甚至不要承认它的存在。
如果输入有很多具体的你需要处理的属性,也不能假设initObject已经有确切需要的布局,然后避免诱惑,利用反射的方法或类似语法Object.entries(),for...in,对象蔓延和休息语法等。
继续单独处理所需的特定属性,并在必要时将逻辑分解为可分离的函数,每个函数处理属性的可管理子集。
另一方面,如果您可以对输入进行预处理,以使其具有已经需要的确切布局(例如,您可以假定initObject仅具有band c),则可以随意使用反射-正是它的用途。
如果以上两点都不适合您,并且您仍然发现您确实想initObject拥有许多任意属性,而又有一些您想忽略的属性,那么您应该在此答案的开头使用建议(或一个)其他适合您的答案)。
但是,如上所述,这是代码气味,它指示您的逻辑需要对对象1的布局更为宽大,或者输入的前提条件需要更改2。
| 归档时间: |
|
| 查看次数: |
1113 次 |
| 最近记录: |