簡體   English   中英

比較兩個 JavaScript 對象的鍵

[英]Comparing the keys of two JavaScript objects

我有兩組 JavaScript 對象。 我想將 object1 與 object2 進行比較,然后獲取 object1 中但不在 object2 中的所有鍵的列表。 我一直在尋找資源來幫助我,但我最終只找到了簡單對象的比較函數。 我要比較的對象有很多嵌套。 我在底部包含了一個示例。

我將如何制作一個比較這兩個對象的函數? 是否可以創建一個靈活的函數,如果對象要更改並包含更多嵌套,它也可以工作?

const object1 = {
    "gender": "man",
    "age": 33,
    "origin": "USA",
    "jobinfo": {
        "type": "teacher",
        "school": "Wisconsin"
    },
    "children": [
        {
            "name": "Daniel",
            "age": 12,
            "pets": [
                {
                    "type": "cat", 
                    "name": "Willy",
                    "age": 2
                },
                {
                    "type": "dog", 
                    "name": "jimmie",
                    "age": 5
                }
            ]
        },
        {
            "name": "Martin",
            "age": 14,
            "pets": [
                {
                    "type": "bird", 
                    "name": "wagner",
                    "age": 12
                }
            ]
        }
    ],
    "hobbies": {
        "type": "football",
        "sponsor": {
            "name": "Pepsi",
            "sponsorAmount": 1000,
            "contact": {
                "name": "Leon",
                "age": 59,
                "children": [
                    {
                        "name": "James",
                        "pets": [
                            {
                                "type": "dog",
                                "age": 4
                            }
                        ]
                    }
                ]
            }
        }
    }
}

const object2 = {
    "gender": "man",
    "jobinfo": {
        "type": "teacher"
    },
    "children": [
        {
            "name": "Daniel",
            "age": 12,
            "pets": [
                {
                    "type": "cat", 
                    "name": "Willy",
                    "age": 2
                },
                {
                    "type": "dog", 
                    "name": "jimmie",
                    "age": 5
                }
            ]
        }
    ]
}

所以我想通過比較這兩個對象來實現,在這種情況下,有一個數組返回,它由 object1 中的鍵組成,但不是 object2。 所以數組看起來像這樣。

["age", "hobbies", "type", "sponsor", "name", "sponsorAmount", "contact", "name", "age", "children", "name", "pets", "type", "age"].

這就是我到目前為止所做的。 這是一種工作。 但它不會打印年齡,例如,因為年齡是存在於多個嵌套對象中的屬性。 jsfiddle: https ://jsfiddle.net/rqdgojq2/

我查看了以下資源:

使用Set對象和自定義getAllKeyNames()遞歸函數從指定對象獲取所有唯一鍵名的復雜解決方案:

 var object1 = {"gender":"man","age":33,"origin":"USA","jobinfo":{"type":"teacher","school":"Wisconsin"},"children":[{"name":"Daniel","age":12,"pets":[{"type":"cat","name":"Willy","age":2},{"type":"dog","name":"jimmie","age":5}]},{"name":"Martin","age":14,"pets":[{"type":"bird","name":"wagner","age":12}]}],"hobbies":{"type":"football","sponsor":{"name":"Pepsi","sponsorAmount":1000,"contact":{"name":"Leon","age":59,"children":[{"name":"James","pets":[{"type":"dog","age":4}]}]}}}}, object2 = {"gender":"man","age":33,"origin":"USA","jobinfo":{"type":"teacher","school":"Wisconsin"},"children":[{"name":"Daniel","age":12,"pets":[{"type":"cat","name":"Willy","age":2},{"type":"dog","name":"jimmie","age":5}]}]}; function getAllKeyNames(o, res){ Object.keys(o).forEach(function(k){ if (Object.prototype.toString.call(o[k]) === "[object Object]") { getAllKeyNames(o[k], res); } else if (Array.isArray(o[k])) { o[k].forEach(function(v){ getAllKeyNames(v, res); }); } res.add(k); }); } var o1Keys = new Set(), o2Keys = new Set(); getAllKeyNames(object1, o1Keys); // unique keys of object1 getAllKeyNames(object2, o2Keys); // unique keys of object2 // get a list of all the keys that are in object1, but not in object2 var diff = [...o1Keys].filter((x) => !o2Keys.has(x)); console.log(diff);

感謝您的反饋。 我最終解決了它,從羅馬人的回答中得到了很多靈感。

const compareObjects = (obj1, obj2)  => {
    function getAllKeyNames(o, arr, str){
        Object.keys(o).forEach(function(k){
            if (Object.prototype.toString.call(o[k]) === "[object Object]") {
                getAllKeyNames(o[k], arr, (str + '.' + k));
            } else if (Array.isArray(o[k])) {
                o[k].forEach(function(v){
                    getAllKeyNames(v, arr, (str + '.' + k));
                });
            }
            arr.push(str + '.' + k);
        });
    }

    function diff(arr1, arr2) {
        for(let i = 0; i < arr2.length; i++) {
            arr1.splice(arr1.indexOf(arr2[i]), 1);
        }
        return arr1;
    }

    const o1Keys = [];
    const o2Keys = [];
    getAllKeyNames(obj1, o1Keys, ''); // get the keys from schema
    getAllKeyNames(obj2, o2Keys, ''); // get the keys from uploaded file

    const missingProps = diff(o1Keys, o2Keys); // calculate differences
    for(let i = 0; i < missingProps.length; i++) {
        missingProps[i] = missingProps[i].replace('.', '');
    }
    return missingProps;
}

jsfiddle在這里: https ://jsfiddle.net/p9Lm8b53/

您可以使用對象進行計數。

 function getCount(object, keys, inc) { Object.keys(object).forEach(function (k) { if (!Array.isArray(object)) { keys[k] = (keys[k] || 0) + inc; if (!keys[k]) { delete keys[k]; } } if (object[k] && typeof object[k] === 'object') { getCount(object[k], keys, inc) } }); } var object1 = { gender: "man", age: 33, origin: "USA", jobinfo: { type: "teacher", school: "Wisconsin" }, children: [{ name: "Daniel", age: 12, pets: [{ type: "cat", name: "Willy", age: 2 }, { type: "dog", name: "jimmie", age: 5 }] }, { name: "Martin", age: 14, pets: [{ type: "bird", name: "wagner", age: 12 }] }], hobbies: { type: "football", sponsor: { name: "Pepsi", sponsorAmount: 1000, contact: { name: "Leon", age: 59, children: [{ name: "James", pets: [{ type: "dog", age: 4 }] }] } } } }, object2 = { gender: "man", jobinfo: { type: "teacher" }, children: [{ name: "Daniel", age: 12, pets: [{ type: "cat", name: "Willy", age: 2 }, { type: "dog", name: "jimmie", age: 5 }] }] }, count = {}; getCount(object1, count, 1); getCount(object2, count, -1); console.log(count);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

這種遞歸方法最適合我。

let object1 =  {
  a: 40,
  b: 80,
  c: 120,
  xa: [
    {
      xc: 12,
      xz: 12
    }
  ],
  rand: 12
};

let object2 = {
  a: 20,
  b: 30,
  c: 40,
  xa: [
    {
      xy: 12,
      xz3: 12
    }
  ]
};


function getObjDifferences(obj, obj2, propsMissing, keyName) {
  Object.keys(obj).forEach(key => {
    if(obj2[key] === undefined) {
      if(keyName.length > 0) propsMissing.push(keyName+"->"+key);
      else propsMissing.push(key)
    } else if (typeof obj[key] === 'object' && obj[key] !== null) {
      if(obj2[key] !== undefined) {
        if(keyName.length > 0) getObjDifferences(obj[key], obj2[key], propsMissing, keyName+"->"+key)
        else getObjDifferences(obj[key], obj2[key], propsMissing, key)
      } else {
        propsMissing.push(key)
      }      
    }
  })
  return propsMissing;
}

console.log(getObjDifferences(object1, object2, [], ''))
console.log(getObjDifferences(object2, object1, [], ''))

暫無
暫無

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

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