Javascript 复制一个对象中的所有元素,但与另一个对象中的元素共享其键的元素除外

Javascript 复制一个对象中的所有元素,但与另一个对象中的元素共享其键的元素除外,javascript,ecmascript-6,Javascript,Ecmascript 6,我有两个目标: obj1 = { a: 1, b: 2, c: 3, d: 4 } 及 我想从中创建第三个对象: obj3 = { b: 2, d: 4 } 第三个对象应该包含来自第一个对象的所有元素,除了那些与第二个对象中的元素共享键的元素 如果排除的钥匙是硬编码的,我知道实现这一点的方法: const { a, c, ...obj3 } = obj1; 或 如果排除的密钥不是硬编码的,而是另一个对象的密钥,如我上面所述,有没有办法做到这一点? 我之所以需要

我有两个目标:

obj1 = {
  a: 1,
  b: 2,
  c: 3,
  d: 4
}

我想从中创建第三个对象:

obj3 = {
  b: 2,
  d: 4
}
第三个对象应该包含来自第一个对象的所有元素,除了那些与第二个对象中的元素共享键的元素


如果排除的钥匙是硬编码的,我知道实现这一点的方法:

const { a, c, ...obj3 } = obj1;


如果排除的密钥不是硬编码的,而是另一个对象的密钥,如我上面所述,有没有办法做到这一点?



我之所以需要这样做,是因为在我的react应用程序中,我想将容器组件的所有道具都传播到它的子组件,容器组件的
道具类型中定义的道具除外(容器组件使用的道具不应该被传递)。

您的最后一个示例是一个很好的开始。您可以将其与
Object.keys
组合以实现所需:

让obj1={
答:1,,
b:2,
c:3,
d:4
}
设obj2={
答:“福”,
c:“酒吧”
}
const obj3=Object.assign({},obj1);
key(obj2).forEach(key=>deleteobj3[key]);

控制台日志(obj3)您的最后一个示例是一个良好的开端。您可以将其与
Object.keys
组合以实现所需:

让obj1={
答:1,,
b:2,
c:3,
d:4
}
设obj2={
答:“福”,
c:“酒吧”
}
const obj3=Object.assign({},obj1);
key(obj2).forEach(key=>deleteobj3[key]);

控制台日志(obj3)
迭代第一个对象的键
obj1
,检查键是否存在于
obj2
中,如果在
obj1
obj2
中都不存在,则将其添加到第三个
obj3

让obj1={
答:1,,
b:2,
c:3,
d:4
}
设obj2={
答:“福”,
c:“酒吧”
}
设obj3={};
Object.keys(obj1.forEach((key)=>{if(!(在obj2中键入)){
obj3[键]=obj1[键];
}

});
迭代第一个对象的键
obj1
,检查键是否存在于
obj2
中,如果在
obj1
obj2
中都不存在,则将其添加到第三个
obj3

让obj1={
答:1,,
b:2,
c:3,
d:4
}
设obj2={
答:“福”,
c:“酒吧”
}
设obj3={};
Object.keys(obj1.forEach((key)=>{if(!(在obj2中键入)){
obj3[键]=obj1[键];
}
});
您可以与一起使用,并使用
obj1
的所有键构建一个新对象,这些键在
obj2
上不存在:

constObjectDiff=(o1,o2)=>
Object.entries(o1)//获取键/值对数组
.减少((r[k,v])=>({
…r,//添加对象的上一个状态
…k in o2 |{[k]:v}//如果键不在第二个对象中,则添加它
}), {});
常数obj1={
答:1,,
b:2,
c:3,
d:4
}
常数obj2={
答:“福”,
c:“酒吧”
}
const result=objectDiff(obj1、obj2);
控制台日志(结果)
您可以与一起使用,并使用
obj1
的所有键构建一个新对象,这些键在
obj2
上不存在:

constObjectDiff=(o1,o2)=>
Object.entries(o1)//获取键/值对数组
.减少((r[k,v])=>({
…r,//添加对象的上一个状态
…k in o2 |{[k]:v}//如果键不在第二个对象中,则添加它
}), {});
常数obj1={
答:1,,
b:2,
c:3,
d:4
}
常数obj2={
答:“福”,
c:“酒吧”
}
const result=objectDiff(obj1、obj2);

控制台日志(结果)方法1:使用
对象键

const obj4 = Object.assign({}, obj1);
Object.keys(obj2).forEach(key => delete obj4[key]);
方法2:另一种更干净的方法,使用
for in
循环和
hasOwnProperty

function filterKeys(obj1, obj2) {
  const returnObj = {};
  for (const prop in obj1) {
    if (obj1.hasOwnProperty(prop) && !obj2.hasOwnProperty(prop)) {
      console.log(`obj1.${prop} = ${obj1[prop]}`);
      returnObj[prop] = obj1[prop];
    } 
  }
  return returnObj;
}

方法1:使用
对象键

const obj4 = Object.assign({}, obj1);
Object.keys(obj2).forEach(key => delete obj4[key]);
方法2:另一种更干净的方法,使用
for in
循环和
hasOwnProperty

function filterKeys(obj1, obj2) {
  const returnObj = {};
  for (const prop in obj1) {
    if (obj1.hasOwnProperty(prop) && !obj2.hasOwnProperty(prop)) {
      console.log(`obj1.${prop} = ${obj1[prop]}`);
      returnObj[prop] = obj1[prop];
    } 
  }
  return returnObj;
}
您还可以使用和来实现所需的输出:

constobj1={a:1,b:2,c:3,d:4}
常量obj2={a:“foo”,c:“bar”}
const obj3=Object.keys(obj1).filter(k=>!obj2.hasOwnProperty(k)).reduce((a,e)=>(a[e]=obj1[e],a),{});
控制台日志(obj3)您还可以使用和来实现所需的输出:

constobj1={a:1,b:2,c:3,d:4}
常量obj2={a:“foo”,c:“bar”}
const obj3=Object.keys(obj1).filter(k=>!obj2.hasOwnProperty(k)).reduce((a,e)=>(a[e]=obj1[e],a),{});

控制台日志(obj3)
如果
obj2
中的任何值为
0
,则此项不起作用。如果
obj2
中的任何值为
0
,则此项不起作用。