我搜索了很多,但是得到的是如何合并对象并保留两者的属性。只保留相同的道具怎么样?例如:
const obj1 = {a: 1, b:2, c:3}
const obj2 = {a: 3, b:3, d:5, e:7}
有什么方法可以创建一个{a:3,b:3}的obj3(仅在两个对象中都保留道具)?
答案 0 :(得分:6)
一个选择是通过reduce
的条目来obj2
,如果属性存在于obj1
中,则将它们分配给累加器对象:
const obj1 = {a: 1, b:2, c:3}
const obj2 = {a: 3, b:3, d:5, e:7}
console.log(
Object.entries(obj2).reduce((a, [key, val]) => {
if (key in obj1) a[key] = val;
return a;
}, {})
);
答案 1 :(得分:2)
接受答案是一个很好的方法,但以下结果可能会更有效;
var obj1 = {a: 1, b:2, c:3},
obj2 = {a: 3, b:3, d:5, e:7},
res = {};
for (k in obj1) k in obj2 && (res[k] = obj2[k]);
console.log(res);
答案 2 :(得分:1)
您可以转换为数组(在Object.entries
的帮助下进行过滤),然后再转换回数组(在reduce
的帮助下)
Object.entries(obj2)
.filter(([key]) => (key in obj1))
.reduce((obj, [key, val]) => ({...obj, [key]: val}), {})
答案 3 :(得分:0)
这是一种尝试通过减少键次数(减少迭代次数)遍历对象来提高效率的方法:
const obj1 = {a: 1, b:2, c:3}
const obj2 = {a: 3, b:3, d:5, e:7}
// find sm/lg object by key length
let [sm,lg]=[obj1,obj2].sort((a,b)=>(
Object.keys(a).length-Object.keys(b).length
));
const merged = {}
// make small object outer loop
for (let key in sm){
if (key in lg)
merged[key]=obj2[key] // only store if key in both objects
}
console.log(merged);