js去掉两个对象不相同的部分

现在有两个对象,一个是A 一个是B A中有和B中相同的属性名,现在我想得到AB不相同的部分应该怎么弄呢?

备注:键名相同的就不要

阅读 4.5k
7 个回答
function diff(a, b) {
    var ret = Object.assign({}, a, b);
    for (var key in ret) {
        if (key in a && key in b) delete ret[key];
    }
    return ret;
}
console.log(diff(A, B));
const pickDiffAttr  = (obj1, obj2) => Object.keys(obj2).reduce((ret, attr) => {
    if (ret[attr]) delete ret[attr]
    else ret[attr] = obj2[attr]
    return ret
}, {...obj1})

const a = {a:1, b:2, c:3}
const b = {a:2, d:4, f:5}

pickDiffAttr(a, b)

只要键名相同的就不要,还是要一模一样的键值才不要?


虽然思路类似,reduce方法确实巧妙多了

var obj1 = {
    a: 1,
    b: 2,
    c: {
        a: 3
    },
    d: [4, 5]
}
var obj2 = {
    a: {
        b: 1
    },
    c: {
        a: 2
    },
    d: 3,
    e: [4, 5]
}

function filterSameKey (o1, o2) {
    let subset = {}
    let remain = JSON.parse(JSON.stringify(o2))
    for (let key of Object.keys(o1)) {
        remain.hasOwnProperty(key) ? delete remain[key] : (subset[key] = o1[key])
    }
    return Object.assign(subset, remain)
}

filterSameKey(obj1, obj2)
var anObj = { 100: 'a', 2: 'b', 7: 'c',44:'dssdd' };

var bObj = { 100: 'a', 2: 'b', 7: 'c' ,9:'cs存储'};

function csFun(aObj,bObj){
   let aArr= Object.keys(aObj)
   let bArr=Object.keys(bObj)
   let a2=aArr.filter(word => bArr.indexOf(word)===-1);
   let b2=bArr.filter(word => aArr.indexOf(word)===-1);
   let rObj={}
   a2.forEach(function(e){
      rObj[e]=aObj[e]
   });
   b2.forEach(function(e){
      rObj[e]=bObj[e]
   });
   return rObj
}

console.log(csFun(anObj,bObj));

虽然不如下面的用reduce方法简洁,不过还是弄上来吧

for(key in A) {
    if (B[key]) {
        // key相同键名
    } else {
        // key不同键名
    }
}
var obj1={"name":11111,"age":22222,"type":33333};
var obj2={"name":11111,"age2":444,"type":5555};
for(let key in obj1){
    for(let key2 in obj2){
        if(obj2[key]){
            delete obj2[key]
        }
    }
};

想得到所有的随后两个对象合并就好了

直接用includes方法判断就好啦

    const a = {d: 1, e: 2, c: 3}
    const b = {d: 1, e: 8, f: 5}
    const za = Object.keys(a)
    const kb = Object.keys(b)
    const result = za.map(item => {
        if (!kb.includes(item)) {
            return item
        }
    })
    

也可以直接像楼上那种写法

        const a = {d: 1, e: 2, c: 3}
        const b = {d: 1, e: 8, f: 5}
        const result = []
        for (let item in a) {
            if (!b[item])
                result.push(item)
        }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题