亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

比較兩個對象并獲取共同值 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條經驗 獲得超8個贊

像這樣的東西應該有效。一個遞歸函數,僅遍歷對象的所有鍵。


它不處理數組,但如果需要的話可以對其進行修改。


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 關注
  • 128 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號