簡體   English   中英

比較兩個對象,得到共同值 JavaScript

[英]Compare two objects and get common values JavaScript

我想比較兩個對象,並想制作一個具有共同屬性的新 object。 我已經看到了很多不同的解決方案,但不確定我們如何能夠采取共同的價值觀。

這是我的對象,如果 obj1 的 iscommisonAccount 為 false 並且 obj2 的 iscommisonAccount 為 true,那么我的結果不應該有值,因為如果兩者都具有相同的屬性則它不匹配,那么只會得到結果。

我知道如果我們有 arrays 對象,我們可以使用過濾器,但如果我們只有對象怎么辦。

 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":{ } } or obj 1 = { "val1":"test", "stream":{ "iscommisonAccount":true, "istradeAccount":true } } obj 2 = { "val1":"test", "stream":{ "iscommisonAccount":true, "istradeAccount":true } } result = { "stream":{ "iscommisonAccount":true, "istradeAccount":true } }

像這樣的東西應該工作。 一個遞歸的 function,它只運行 object 的所有鍵。

它不處理 arrays,但如果需要,它可以修改為。

 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,
        {}
    );

Here is a simple example that uses a combination of Object.values and Object.keys as arrays that are filtered to produce your prescribed output:

 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM