使用 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);
这是迄今为止在 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);