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
或”
,则此项不起作用。