Javascript-如何合并到对象但仅保留相同的属性

时间:2018-08-23 02:31:51

标签: javascript

我搜索了很多,但是得到的是如何合并对象并保留两者的属性。只保留相同的道具怎么样?例如:

const obj1 = {a: 1, b:2, c:3}
const obj2 = {a: 3, b:3, d:5, e:7}

有什么方法可以创建一个{a:3,b:3}的obj3(仅在两个对象中都保留道具)?

4 个答案:

答案 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);