【问题标题】:Comparing Two JSON Objects比较两个 JSON 对象
【发布时间】:2014-03-02 06:18:19
【问题描述】:

我正在尝试找到一种更快的方法来比较两个 json 对象。目前,我们有一个函数,其中有大约 7 个 $.each() 调用,我认为这是一种非常低效的方法,但我不知道如何更快地做到这一点。我将发布比较两个对象的函数,以及两个对象的示例。

这只是来自 object-1 的一条数据。整个对象中有大约 4000 个。

{
"aaData": [
 {
  "serial":"LRRFNGHX",
  "model":"Dell Optiplex",
  "os":"Windows NT",
  "man":"Dell",
  "group":"558D",
  "pcName":"LID93740SHD0",
  "department":"HR",
  "customerName":"Bill gates",
  "username":"bgates",
  "deployLocation":"Chicago, IL",
  "currentLocation":"127.0.0.1",
  "cnStatus":"Usable",
  "previousModel":"Gateway",
  "id":"256",
  "enabled":"false"
  }
 ]
}

这是来自 object-2 的一个值。这个对象要小得多,在 object-2 中最多只有 100 个值。

{
    "team": {},
    "department": {
        "Automotive": "Automotive"
        },
    "os": {},
    "man": {},
    "model": {},
    "cnStatus": {
        "Usable": "Usable"
        }
}

这是有史以来最丑陋的功能。这将比较这两个对象,并将较大对象中的 enabled 属性设置为所有匹配项:

function objCompare(){
        newTotal = 0; 
        var typeCount = 0;
        var menuArray = [];
        console.log(JsonObj);
        $.each(menuObject, function (i, type){
            var empty = jQuery.isEmptyObject(type);
            if(empty === false){
                if(typeCount == 0){
                    $.each(type, function (j, subtype){
                        menuArray.push(subtype);
                        $.each(JsonObj, function(key, element){
                            element.enabled = "false";
                            $.each(element, function(key, subelement){                                
                                if( (subelement != null) && (menuArray.contains(subelement.replace(/\s/g, ''))) ){
                                    element.enabled = "true";
                                }
                           });
                        });
                    });
                }else if(typeCount >= 1){
                    $.each(type, function (j, subtype){;
                        menuArray.push(subtype);
                    });
                    $.each(JsonObj, function(key, element){
                        if((element.enabled === "true") && !menuArray.contains(element[i])){
                            element.enabled = "false";
                        }
                    });
                }
                typeCount++;
            }
            if(empty === true){
             if(typeCount === 0){
                $.each(JsonObj, function(key, element){
                    element.enabled = "false";
                    });
                }
            }
        });
    }

【问题讨论】:

  • 在比较两个对象时,您真正想知道什么?你漏掉了那个重要的细节!您想知道每个对象具有完全相同的键和这些键的值吗?如果一个对象有另一个对象中不存在的额外键怎么办?您是否需要进行深入的嵌套比较,以便如果有一个对象数组,该数组或对象的内容与另一个对象中的内容相同?
  • 我想知道 object-1 中是否有与 object-2 中的属性匹配的属性。这需要进行深入的比较。键的数量无关紧要,只需要查看该键的值是否存在于另一个对象中的任何位置,然后将其属性设置为“真”
  • 您只想知道两个对象中是否都存在该属性吗?或者,如果两个对象中该属性的属性和值相同?您在寻找特定的属性名称吗?或者只是obj1 中的任何属性也存在于对象中任何深度的obj2 中?您是否忽略了比较中不需要的任何特定属性名称?
  • 我正在查看 object1 中的任何属性是否存在于 object2 中任何位置的任何级别。将 object1 的所有属性与 object2 的所有属性进行比较。
  • 而且你不关心属性的值,只关心它存在于两个对象中?

标签: javascript arrays json multidimensional-array compare


【解决方案1】:

这是一个函数,它递归地收集两个对象中的所有属性,然后返回一个包含它们之间任何公共属性名称的数组。如果返回的数组中有.length === 0,则没有公共属性。否则,它包含公共属性名称。如果您需要进一步检查,您显然可以为这个相当通用的函数添加更多细节。

如果您需要知道公共道具在两个对象中的位置,您可以更改地图以保存父对象,而不仅仅是将其设置为true,但是您必须处理以下问题该属性不止一次出现。我没有详细说明,因为您对要执行的操作的规范没有详细说明,因此我将其留在这里,并提供了一个函数,该函数显示了如何递归遍历对象中的所有属性。

function findCommonProps(obj1, obj2) {
    var map1 = {}, map2 = {};
    var commonProps = [];

    function isArray(item) {
        return Object.prototype.toString.call(item) === "[object Array]";
    }

    function getProps(item, map) {
        if (typeof item === "object") {
            if (isArray(item)) {
                // iterate through all array elements
                for (var i = 0; i < item.length; i++) {
                    getProps(item[i], map);
                }
            } else {
                for (var prop in item) {
                    map[prop] = true;
                    // recursively get any nested props
                    // if this turns out to be an object or array
                    getProps(item[prop], map);
                }
            }
        }
    }

    // get all properties in obj1 into a map
    getProps(obj1, map1);
    getProps(obj2, map2);
    for (var prop in map1) {
        if (prop in map2) {
            commonProps.push(prop);
        }
    }
    return commonProps;
}

工作演示:http://jsfiddle.net/jfriend00/ESBZv/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2018-03-28
    相关资源
    最近更新 更多