Javascript 合并两个对象,但显式定义可以设置的关键点
我想将两个对象合并成一个新对象,如果两个对象都有属性,则一个对象将覆盖属性 这对于ES6排列非常容易做到,但是在这个特殊的情况下,我想使用一种方法来定义可以设置哪些键。基本上创建一个“白名单”的属性是允许我的最终对象。(通过利差,任何财产都将合并到新对象中) 有没有一种方法可以使用ES6+来实现这一点 两个对象:Javascript 合并两个对象,但显式定义可以设置的关键点,javascript,ecmascript-6,ecmascript-2016,Javascript,Ecmascript 6,Ecmascript 2016,我想将两个对象合并成一个新对象,如果两个对象都有属性,则一个对象将覆盖属性 这对于ES6排列非常容易做到,但是在这个特殊的情况下,我想使用一种方法来定义可以设置哪些键。基本上创建一个“白名单”的属性是允许我的最终对象。(通过利差,任何财产都将合并到新对象中) 有没有一种方法可以使用ES6+来实现这一点 两个对象: var o1 = { a: 'foo', b: 'bar', c: 'baz' } var o2 = { a: 'pop', bad_property: 'd
var o1 = {
a: 'foo',
b: 'bar',
c: 'baz'
}
var o2 = {
a: 'pop',
bad_property: 'dont copy me'
}
var oMerged = {
a: 'pop', // I came from obj_2
b: 'bar',
c: 'baz'
}
// Method 1: Use spreads, problem is this hides the keys.
var oMerged = {
...o1,
...o2
};
// Method 2: Shows each key, but requires a ternary to check if obj_2 has the key.
var oMerged = {
a: (o2.a !== undefined) ? o2.a : o1.a,
b: (o2.b !== undefined) ? o2.b : o1.b,
c: (o2.c !== undefined) ? o2.c : o1.c
}
// Method 3: Define what keys can be merged, but use a more concise syntax / possibly an ES6+ feature.
???
合并方法:
var o1 = {
a: 'foo',
b: 'bar',
c: 'baz'
}
var o2 = {
a: 'pop',
bad_property: 'dont copy me'
}
var oMerged = {
a: 'pop', // I came from obj_2
b: 'bar',
c: 'baz'
}
// Method 1: Use spreads, problem is this hides the keys.
var oMerged = {
...o1,
...o2
};
// Method 2: Shows each key, but requires a ternary to check if obj_2 has the key.
var oMerged = {
a: (o2.a !== undefined) ? o2.a : o1.a,
b: (o2.b !== undefined) ? o2.b : o1.b,
c: (o2.c !== undefined) ? o2.c : o1.c
}
// Method 3: Define what keys can be merged, but use a more concise syntax / possibly an ES6+ feature.
???
编辑:明确地说对象应该有一个可接受属性的白名单。有很好的答案,但他们需要不可接受的属性黑名单。“白名单”的原因是它向其他开发者展示了最终对象的形状 试试
功能(Obj1、Obj2){
['can'、'set'、'this'].forEach(key=>Obj1[key]&&(Obj2[key]=Obj1[key]))
}
在这里,您可以使用工厂()
函数创建不同的合并函数,每个函数都有自己的一组允许字,然后调用这些函数来合并任意数量的对象
const obj1={
a:‘福’,
b:‘酒吧’,
c:‘baz’
}
常量obj2={
a:‘流行音乐’,
坏的财产:“不要复制我”
}
常数obj3={
另一个"测试",,
另一个坏属性:“也不要复制这个”
}
常量工厂=允许=>{
返回(…参数)=>{
常数temp={}
args.forEach(对象=>{
Object.keys(obj.forEach)(key=>{
如果(允许。索引(键)!=-1){
温度[键]=对象[键]
}
})
})
返回温度
}
}
const mergeWith4AllowedKeys=工厂(['a','b','c','other_one']))
const merged=mergeWith4AllowedKeys(obj1、obj2、obj3)
console.log(合并)
const mergeWith3AllowedKeys=工厂(['a','b','c'])
const secondBatch=mergewith3允许的键(obj1、obj2)//仅2
console.log(secondBatch)
您可以使用省略
函数(如lodash提供的函数)创建没有特定键的对象克隆。然后可以合并该对象:
函数省略(对象,黑名单){
返回Object.keys(对象).reduce((结果,键)=>{
如果(!黑名单包括(键)){
结果[键]=对象[键];
}
返回结果;
}, {});
}
var o1={
a:‘福’,
b:‘酒吧’,
c:‘baz’
}
var o2={
a:‘流行音乐’,
坏的财产:“不要复制我”
}
var黑名单=['bad_property'];
合并变量={
…省略(o1,黑名单),
…省略(o2,黑名单)
};
console.log(合并)代码>这是ES2017实施,例如在
使用现有的o1
和o2
,您可以编写:
let merged = { ...o1, ...o2 };
// and then use Object rest as the dual of object spreads, to pick up the wanted properties
let { bad_property, ...oMerged } = merged;
这是我想出的最短的方法,可以让你
设置要覆盖的属性的顺序
让您声明在最终对象中哪些属性是可接受的
每个属性不需要长的ternaries
// Step 1. merge all properties into a new object.
var oMerged = {...o1, ...o2};
// Step 2. Explicitly use keys to assign
var oFinal = {
a: oM.a,
b: oM.b,
c: oM.c
};
你确定你不是在找我吗?你能解释一下你需要它做什么吗?再次查看Object.assign,但如果我没记错的话,它会从任何对象复制所有可枚举属性-因此它会包括来自obj_2的“bad_属性”。看看这个:你的解决方案不会缩放…如果你有100个对象,每个对象都有100个属性,会发生什么。有趣的是,但这难道不需要一个明确的“坏”属性列表吗?基本上是黑名单而不是白名单?是的,我假设你可以把它放在某个黑名单对象中,像let{…badProps,…oMerged}=merged那样使用它
所有其他不在badProps中的键都应该转到刚才声明的空的oMerge
,但是我还没有尝试过这个版本的yetOk,所以经过一些研究,这个解决方案只有在您显式键入“bad”时才有效属性当使用rest操作符transk@motanelu时,这是一个非常可靠的答案-主要问题是它需要一个禁用属性列表。我想要的不是黑名单上的禁止财产,而是白名单上的可接受财产。目的是向其他开发人员展示最终对象的“形状”。