ES2015解构为一个对象

Ger*_*int 6 javascript ecmascript-6

我试图解构一个对象并将取出的变量应用到它自己的对象中.

例如,对象beforeTest包含a,b,c,d

我想把{a,b}输出并添加到afterTest对象.

就像是...

let afterTest = { a, b } = beforeTest
Run Code Online (Sandbox Code Playgroud)

以下是有效的,但是当你有很多变量时它们并不是很漂亮.

let { a, b } = beforeTest;
let afterTest = Object.assign({}, a, b); //EDIT: This doesn't actually do what I intended, see comment on my question
Run Code Online (Sandbox Code Playgroud)

谁知道有更好的方法来写这个?

谢谢

ssu*_*ube 2

解构和对象速记在这里是最好的朋友。

要从对象中选择一些属性并使用该子集创建新对象,您可以简单地执行以下操作:

let {a, b} = beforeTest;
let afterTest = {a, b};
Run Code Online (Sandbox Code Playgroud)

为此提供一行语法没有多大意义,因为当前语法很容易扩展到多个源/接收器:

let {a1, b1} = beforeTest;
let {a2, b2} = midTest;
let aN = {a1, a2}, bN = {b1, b2};
Run Code Online (Sandbox Code Playgroud)

如果您的源没有重复的属性(即源 1 和 2 中只有一个具有 field a),则可以使用 map (pluck) 和 reduce 在一行中完成此工作:

let beforeTest = {a: 1, b: 2, c: 3};
let midTest = {d: 4, e: 5, f: 6};

let fields = ['a', 'c', 'd'];
let afterTest = Object.assign.apply({}, [beforeTest, midTest].map(obj => {
  return Object.keys(obj).filter(key => fields.includes(key)).reduce((p, key) => (p[key] = obj[key], p), {});
}));

console.log(afterTest);
Run Code Online (Sandbox Code Playgroud)

我认为最后一种方法不值得麻烦,因为它对于数据的来源相当不透明。