【问题标题】:Merge specific prop of objects into one using es6?使用 es6 将对象的特定道具合并为一个?
【发布时间】:2018-07-25 12:37:18
【问题描述】:

这是迄今为止 SO 中最常见的问题,但是,总而言之,提出的问题是指合并两个完整的对象。

就我而言,情况完全不同。

假设给我:

const P1 = {
  "name"          : "Person1",
  "profession"    : "Student",
  "gender"        : "Male",
  "type"          : "Patient",
}

const E1 = {
  "age"           : "30",
  "dob"           : "20/12/1970",
  "address"       : "122 Harrow Street",
  "contactNumber" : "07473033312",
}

我想合并这两个给我以下内容:

const Result = {
  "name"          : "Person1",
  "type"          : "Patient",
  "age"           : "30",
  "dob"           : "20/12/1970",
}

问题是,我不想合并两个完整的项目。我想合并特定的道具而不循环。

目前,我们可以像这样使用spread来实现合并:

const data = [...P1, ...E1];.

但这两者合并,我不想要。

【问题讨论】:

  • 您的具体问题在哪里?
  • 我已经更新了我的问题@NinaScholz
  • @doe 以供将来参考,一旦您的原始问题已被回答(已回答),请勿对其进行编辑以提出其他问题,从而使原始答案不再有效。只需接受并提出一个新问题。
  • 对不起,伙计们。我的错。由于相似性,我的问题会被关闭吗? @JasonCust
  • @doe 您应该先自己尝试一下,何时/如果您遇到困难,然后发布并包括您尝试过的内容以及卡住的位置。

标签: javascript object merge ecmascript-6 object-properties


【解决方案1】:

如果您知道合并对象应具有哪些属性(在您的情况下为 name, type, age, dob

如何定义它们:

const P1 = {
    "name"          : "Person1",
    "profession"    : "Student",
    "gender"        : "Male",
    "type"          : "Patient",
}

const E1 = {
    "age"           : "30",
    "dob"           : "20/12/1970",
    "address"       : "122 Harrow Street",
    "contactNumber" : "07473033312",
}

const Result = {
    "name"          : P1.name || E1.name,
    "type"          : P1.type || E1.type,
    "age"           : P1.age || E1.age,
    "dob"           : P1.dob || E1.dob,
}

【讨论】:

  • 可以动态做吗?目前我看到我必须自己创建 Result 对象并分配静态键
  • @doe 你如何“动态”决定哪些键进入结果对象?
  • 这可以在@Jonas 回答中看到
【解决方案2】:
 const result = (({name, type}, {age, dob}) => ({name, type, age, dob}))(P1, P2);

只需部分破坏 P1 和 P2 并构建一个新对象。

【讨论】:

  • 完全是我的错。你的回答是可以接受的。但是,如果我们有一个对象数组而不仅仅是 P1 和 E1,这将如何应用?
  • @doe 你没有更新,你完全改变了它。你怎么不早点给呢??好的,我认为最好用你的新代码问一个新问题。
  • 抱歉,完全是我的错。我忘记了我有嵌套对象而不是单个对象。再次道歉。
【解决方案3】:

由于您正在寻找一种 ES6 方式,我想说使用解构是要走的路:

const P1 = {
    "name"          : "Person1",
    "profession"    : "Student",
    "gender"        : "Male",
    "type"          : "Patient",
}

const E1 = {
    "age"           : "30",
    "dob"           : "20/12/1970",
    "address"       : "122 Harrow Street",
    "contactNumber" : "07473033312",
}

const { name, type } = P1;
const { age, dob } = E2;
const Result = { name, type, age, dob };

【讨论】:

    【解决方案4】:

    您可以使用完整的动态方法,将一个数组用于所需属性,另一个用于对象。

    然后用找到的对象构建一个新对象。

    var p1 = { name: "Person1", profession:"Student", gender:"Male", type:"Patient" },
        e1 = { age: "30", dob:"20/12/1970", address:"122 Harrow Street", contactNumber:"07473033312" },
        keys = ['name', 'profession', 'age', 'dob'],
        objects = [p1, e1],
        merged = Object.assign(...keys.map(k => ({ [k]: objects.find(o => k in o)[k] })));
    
    console.log(merged);

    【讨论】:

    • 你在循环播放。
    • 我喜欢循环播放。
    • @NinaScholz 哈哈!这是一个令人愉快的答案。请检查我更新的问题。这里似乎有正确的答案,但我更喜欢的解决方案是不同的。谢谢;)
    【解决方案5】:

    我猜你最好的办法是打开包装然后重新包装:

    let {name, type, age, dob} = {...P1, ...E1};
    result = {name, type, age, dob}
    

    这很愚蠢,但这就是我们在 ES6 中所拥有的一切。

    另一种选择是像 lodash 的 _.pick 这样的函数。

    如果您有一个源对象数组,请将{...P1, ...E1} 替换为展开的Object.assign

    let {name, type, age, dob} = Object.assign({}, ...a);
    

    【讨论】:

      猜你喜欢
      • 2018-07-25
      • 2021-07-07
      • 2018-11-23
      • 2018-12-05
      • 2017-02-04
      • 2018-02-09
      • 2016-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多