为了账号安全,请及时绑定邮箱和手机立即绑定

比较两个对象并获取共同值 JavaScript

比较两个对象并获取共同值 JavaScript

HUH函数 2023-10-20 15:31:22
我想比较两个对象,并想要创建一个具有共同属性的新对象。我见过很多采取差异的解决方案,但不确定我们如何采取共同的价值观。这是我的对象,其中如果 obj1 具有 iscommisonAccount false 并且 obj2 具有 iscommisonAccount true 那么我的结果不应该具有值,因为如果两者具有相同的属性,则它不匹配,那么只能得到结果。我知道如果我们有对象数组,我们可以使用过滤器,但如果我们只有对象怎么办?obj 1 = {   "val1":"test",   "stream":{      "iscommisonAccount":false,      "istradeAccount":true   }} obj 2 = {   "val1":"test",   "stream":{      "iscommisonAccount":true,      "istradeAccount":true   }}result = {   "stream":{      "istradeAccount":true   }}diffrent examples:obj 1 = {   "val1":"test",   "stream":{      "iscommisonAccount":false,      "istradeAccount":true   }} obj 2 = {   "val1":"test",   "stream":{      "iscommisonAccount":true,      "istradeAccount":false   }}result = {   "stream":{   }}orobj 1 = {   "val1":"test",   "stream":{      "iscommisonAccount":true,      "istradeAccount":true   }} obj 2 = {   "val1":"test",   "stream":{      "iscommisonAccount":true,      "istradeAccount":true   }}result = {   "stream":{      "iscommisonAccount":true,      "istradeAccount":true   }}
查看完整描述

2 回答

?
慕仙森

TA贡献1827条经验 获得超7个赞

像这样的东西应该有效。一个递归函数,仅遍历对象的所有键。


它不处理数组,但如果需要的话可以对其进行修改。


function findCommonValues(obj1, obj2) {

    var result = {}

    for (let key in obj1) {

        if (obj1[key] && obj1[key] === obj2[key]) result[key] = obj1[key]

        else if (typeof obj1[key] === 'object' && obj1[key] !== null) {

            result[key] = findCommonValues(obj1[key], obj2[key])

        }

    }

    return result;

}


const obj1 = {

    "val1": "test",

    "stream": {

        "iscommisonAccount": false,

        "istradeAccount": true

    }

}


const obj2 = {

    "val1": "test",

    "stream": {

        "iscommisonAccount": true,

        "istradeAccount": true

    }

}


const obj3 = {

    "val1": "test",

    "stream": {

        "iscommisonAccount": false,

        "istradeAccount": true

    }

}


const obj4 = {

    "val1": "test",

    "stream": {

        "iscommisonAccount": true,

        "istradeAccount": false

    }

}


const obj5 = {

    "val1":"test",

    "stream":{

       "iscommisonAccount":true,

       "istradeAccount":true

    }

 }

 

 const obj6 = {

    "val1":"test",

    "stream":{

       "iscommisonAccount":true,

       "istradeAccount":true

    }

 }


console.log(findCommonValues(obj1, obj2))

console.log(findCommonValues(obj3, obj4))

console.log(findCommonValues(obj5, obj6))

如果你希望它尽可能小。这确实是我能做的最好的事情了。


const commonValues = (obj1, obj2) => Object.keys(obj1).reduce((result, key) => obj1[key] && obj1[key] === obj2[key] ? { ...result, [key]: obj1[key] } : typeof obj1[key] === 'object' && obj1[key] !== null ? { ...result, [key]: commonValues(obj1[key], obj2[key]) } : result, {});


const obj1 = {

    "val1": "test",

    "stream": {

        "iscommisonAccount": false,

        "istradeAccount": true

    }

}


const obj2 = {

    "val1": "test",

    "stream": {

        "iscommisonAccount": true,

        "istradeAccount": true

    }

}


const obj3 = {

    "val1": "test",

    "stream": {

        "iscommisonAccount": false,

        "istradeAccount": true

    }

}


const obj4 = {

    "val1": "test",

    "stream": {

        "iscommisonAccount": true,

        "istradeAccount": false

    }

}


const obj5 = {

    "val1": "test",

    "stream": {

        "iscommisonAccount": true,

        "istradeAccount": true

    }

}


const obj6 = {

    "val1": "test",

    "stream": {

        "iscommisonAccount": true,

        "istradeAccount": true

    }

}


console.log(commonValues(obj1, obj2))

console.log(commonValues(obj3, obj4))

console.log(commonValues(obj5, obj6))

TypeScript 版本


export type KeyValueObject = {

    [key: string]: number | boolean | string | KeyValueObject

}


export const isKeyValueObject = (obj1: number | boolean | string | KeyValueObject): obj1 is KeyValueObject => typeof obj1 === 'object' && obj1 !== null;


export const commonValues = (obj1: KeyValueObject, obj2: KeyValueObject): KeyValueObject =>

    Object.keys(obj1).reduce((result, key) =>

        obj1[key] && obj1[key] === obj2[key]

            ? { ...result, [key]: obj1[key] }

            : isKeyValueObject(obj1[key]) && isKeyValueObject(obj2[key])

                ? { ...result, [key]: commonValues(obj1[key] as KeyValueObject, obj2[key] as KeyValueObject) }

                : result,

        {}

    );


查看完整回答
反对 回复 2023-10-20
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

这是一个简单的示例,它使用 Object.values 和 Object.keys 的组合作为数组,经过过滤以生成指定的输出:


let obj1 = { "val1":"test", "stream":{ "iscommisonAccount":false, "istradeAccount":true } }; 

let obj2 = { "val1":"test", "stream":{ "iscommisonAccount":true, "istradeAccount":true } };



let obj3 = { "val1":"test", "stream":{ "iscommisonAccount":true, "istradeAccount":true } }; 

let obj4 = { "val1":"test", "stream":{ "iscommisonAccount":false, "istradeAccount":true } };


let obj5 = { "val1":"test", "stream":{ "iscommisonAccount":false, "istradeAccount":false } }; 

let obj6 = { "val1":"test", "stream":{ "iscommisonAccount":false, "istradeAccount":false } };


let obj7 = { "val1":"test", "stream":{ "iscommisonAccount":true, "istradeAccount":false } }; 

let obj8 = { "val1":"test", "stream":{ "iscommisonAccount":true, "istradeAccount":false } };


interface Data {stream:{[key: string]: boolean}};


function objFilter(objA: Data, objB: Data): Data {

  let out: Data = {stream:{}};

  Object.keys(objA.stream).filter((value, idx) =>

    Object.values(objA.stream)[idx] === Object.values(objB.stream)[idx] ? 

      out.stream[value] = Object.values(objA.stream)[idx] :

      false

  );

  return out;

}

console.log(objFilter(obj1, obj2)); //istradeAccount

console.log(objFilter(obj3, obj4)); //istradeAccount

console.log(objFilter(obj5, obj6)); //iscommisonAccount && istradeAccount

console.log(objFilter(obj7, obj8)); //iscommisonAccount && istradeAccount

console.log(objFilter(obj2, obj7)); //iscommisonAccount


查看完整回答
反对 回复 2023-10-20
  • 2 回答
  • 0 关注
  • 60 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信