Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 合并两个对象,但显式定义可以设置的关键点_Javascript_Ecmascript 6_Ecmascript 2016 - Fatal编程技术网

Javascript 合并两个对象,但显式定义可以设置的关键点

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

我想将两个对象合并成一个新对象,如果两个对象都有属性,则一个对象将覆盖属性

这对于ES6排列非常容易做到,但是在这个特殊的情况下,我想使用一种方法来定义可以设置哪些键。基本上创建一个“白名单”的属性是允许我的最终对象。(通过利差,任何财产都将合并到新对象中)

有没有一种方法可以使用ES6+来实现这一点

两个对象:

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时,这是一个非常可靠的答案-主要问题是它需要一个禁用属性列表。我想要的不是黑名单上的禁止财产,而是白名单上的可接受财产。目的是向其他开发人员展示最终对象的“形状”。