JavaScript解构赋值并将其赋值到新对象中。

3
假设我有一个对象: let x = {a:1,b:2,c:3}
现在我可以按如下方式解构: let {a,b} = x;
是否可以将它们分配到一个新对象中(与解构在同一行),等效于: let newObject = {a,b};
或者(伪代码,我意识到这不起作用) let newObject = {a,b} = x;
还是我需要使用像lodash _.pickBy函数这样的东西? let newObject = _.pickBy(x,['a','b'])
我之所以这样问是因为我想在函数签名上做这样的事情:
let fun = ({a,b}) => {
    let args = {a,b}; // <---- 
}

你不想使用这个 let newObject = {a : x.a, b : x.b}; 吗? - Tushar Shahi
@MikeM 是的,我明白,但如果我有很多变量,那就会变得很繁琐。 - Nicholas Hamilton
fun = ({a,b}) => {let newObject=arguments[0]} - The Bomb Squad
1
你知道的,如果包含 =>,你的 fun 是有效的。 - MikeM
1
我觉得你试图让代码更加简洁,但最终会变得混乱且难以阅读。有时冗长并不是一件坏事。 - Seth Lutske
显示剩余6条评论
2个回答

1

这似乎是不可能的,因为虽然看起来相同,但解构赋值和对象语法完全是两个不同的东西。

let a, b;
{a,b} = x  <-- {a,b} is not an object

如果您尝试返回解构赋值的结果,它仍将返回完整对象中的 x
const result = {a,b} = x 
// `result` is the full object

或者

const result = ({a,b} = x);
// `result` is the full object

无论如何,编写这样的一行代码可能会让队友感到极度困惑。在同行评审中,它总会让我眉头紧锁 :)

0

我认为你需要的是通过键过滤对象而不使用中间变量。

这是我的解决方案:

let x = {a:1,b:2,c:3}
let y = {}
;({a: y.a, b: y.b} = x)

let filterObjectByKeys = (object, keys) => Object.fromEntries(keys.map(k => [k, object[k]]))
let x = {a:1,b:2,c:3}
let y = filterObjectByKeys(x, ['a', 'b'])

参考:

  1. 通过解构为新对象赋值
  2. 在ES6中按键过滤对象属性

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接