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

我想比较两个对象,并想要创建一个具有共同属性的新对象。我见过很多采取差异的解决方案,但不确定我们如何采取共同的价值观。


这是我的对象,其中如果 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":{

   }

}


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

   }

}


HUH函数
浏览 66回答 2
2回答

慕仙森

像这样的东西应该有效。一个递归函数,仅遍历对象的所有键。它不处理数组,但如果需要的话可以对其进行修改。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,        {}    );

慕妹3146593

这是一个简单的示例,它使用 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)); //istradeAccountconsole.log(objFilter(obj3, obj4)); //istradeAccountconsole.log(objFilter(obj5, obj6)); //iscommisonAccount && istradeAccountconsole.log(objFilter(obj7, obj8)); //iscommisonAccount && istradeAccountconsole.log(objFilter(obj2, obj7)); //iscommisonAccount
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript