繁体   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