【问题标题】:ES2015 deconstructing into an object [duplicate]ES2015解构成一个对象[重复]
【发布时间】:2016-05-11 11:58:28
【问题描述】:

我正在尝试解构一个对象并将取出的变量应用到它自己的对象中。

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

我想取出 { a, b } 并将其添加到 afterTest 对象。

类似...

let afterTest = { a, b } = beforeTest

以下方法有效,但当您有很多变量时不是很漂亮。

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

谁知道更好的写法?

谢谢

【问题讨论】:

  • Object.assign({}, a b) 无效。您希望afterTest 包含ab 的属性还是包含与beforeTest 具有相同值的属性ab
  • 是的,只是一直在搞砸并意识到它并没有达到我想要的效果。你说的后者,基本上是用指定的键/值对创建一个新对象。
  • 不幸的是,您将不得不重复变量声明以及对象创建:let { a, b } = beforeTest; let afterTest = {... {a, b}};

标签: javascript ecmascript-6


【解决方案1】:

解构和对象简写在这里是最好的朋友。

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

let {a, b} = beforeTest;
let afterTest = {a, b};

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

let {a1, b1} = beforeTest;
let {a2, b2} = midTest;
let aN = {a1, a2}, bN = {b1, b2};

如果您的来源没有重复的属性(即来源 1 和 2 中只有一个具有字段 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);

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

【讨论】:

    猜你喜欢
    • 2016-03-19
    • 2020-10-13
    • 2021-10-15
    • 2021-03-28
    • 1970-01-01
    • 2020-11-06
    相关资源
    最近更新 更多