使用 es6 将对象的特定道具合并为一个?

Merge specific prop of objects into one using es6?

这是迄今为止在 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];.

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

如果您知道合并后的对象应该具有哪些属性(在您的情况下 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,
}
 const result = (({name, type}, {age, dob}) => ({name, type, age, dob}))(P1, P2);

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

既然你在寻找 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 };

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

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

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);

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

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);