首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >比较两个JSON对象

比较两个JSON对象
EN

Stack Overflow用户
提问于 2014-02-05 17:02:40
回答 1查看 8.9K关注 0票数 2

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

这只是来自对象1的一段数据。在整个物体中大约有4000种。

代码语言:javascript
运行
复制
{
"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"
  }
 ]
}

这是对象2的一个值。这个对象要小得多,对象2中最多可能只有100个值。

代码语言:javascript
运行
复制
{
    "team": {},
    "department": {
        "Automotive": "Automotive"
        },
    "os": {},
    "man": {},
    "model": {},
    "cnStatus": {
        "Usable": "Usable"
        }
}

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

代码语言:javascript
运行
复制
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";
                    });
                }
            }
        });
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-05 17:49:09

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

如果您需要知道公共支柱在这两个对象中的位置,您可以更改映射以保存父对象,而不是仅仅将其设置为true,但是,您必须处理该属性不止一次出现的问题。我没有详细说明这个级别,因为您想要做的规范并不详细,所以我在这里留下了一个函数,该函数演示如何递归遍历对象中的所有属性。

代码语言:javascript
运行
复制
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/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21583665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档