解构赋值用于构造一个新对象 - 是否可行?

8
使用解构赋值语法是否可以将数据对象提取到另一个对象中,而不是单独的变量?

Example which produce distinct variables (foo, bar):

var {p: foo, q: bar} = {p: 42, q: true};
 
console.log(foo); // 42
console.log(bar); // true  

我需要创建一个新的对象,其中包含以下属性:

var n = {
foo: 42,
bar: true
}

@torazaburo 那个话题是我想到的第一件事。但我没有将其标记为重复,因为它不是一个重复的问题。只是相关的。答案只有部分交叉。这个问题是关于默认值的 - 尽管标题所说的不同。 - Estus Flask
3个回答

14

不可能。术语destructuring表示将对象解构为变量。

避免在范围内污染临时变量的一种方法是在解构中使用IIFE:

obj = (({ foo = 'foo', bar = 'bar' }) => ({ foo, bar }))(obj);

这将分配默认值并从对象中仅选择有效键。

如果不需要挑选,则使用本地JS特性ES6 Object.assign 是最清晰的方法:

obj = Object.assign({ foo: 'foo', bar: 'bar' }, obj);

或者 ES2018 的扩展运算符:

obj = { foo: 'foo', bar: 'bar', ...obj};

2

这有点是可以的,但需要两步。你不能直接从一个对象解构到另一个对象中,但你可以通过使用ES6对象符号并将其包装成函数来使其更优雅。

function transformObject(object) {
  const { p: foo, q: bar } = object;
  const newObject = {
    foo,
    bar
  };
  return newObject;
}

0

你不能使用解构来完成这个操作,但是你可以使用类似下面这个帮助函数:

function retag(newStructure, source) {
  var result = {};
  for (var key in newStructure) {
    result[key] = source[newStructure[key]];
  }
  return result;
}

console.log(retag(
  { foo: 'a', bar: 'b' },
  { a: false, b: 42, c: 'unused'}
));


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