2014-02-05 3 views
0

Я пытаюсь найти более быстрый способ сравнить два объекта json. В настоящее время у нас есть функция, которая имеет около 7 $ .each() вызовов в ней, что, я считаю, очень неэффективным способом сделать это, но я понятия не имею, как это сделать быстрее. Я отправлю нашу функцию, которая сравнивает два объекта, а также образец двух объектов.Сравнение двух объектов JSON

Это всего лишь одна часть данных из объекта-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" 
    } 
] 
} 

Это одно значение от объекта-2. Этот объект значительно меньше, и в объекте-2 может быть не более 100 значений.

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

Это самая уродливая функция. Это сравнивает эти два объекта, и устанавливает включено свойство в более крупном объекте к истинному для всех матчей:

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"; 
        }); 
       } 
      } 
     }); 
    } 
+0

Что вы хотите на самом деле знать, в сравнении двух объектов? Вы оставили эту важную деталь! Вы хотите знать, что каждый объект имеет точно такие же ключи и значения для этих ключей? Что делать, если объект имеет дополнительный ключ, который не существует в другом объекте? Вам нужно сделать глубокое, вложенное сравнение, так что если у вас есть массив объектов, содержимое этого массива или объекта будет таким же, как и в другом объекте? – jfriend00

+0

Я хочу знать, есть ли свойство в объекте-1, которое соответствует свойству в объекте-2. Это должно быть глубокое сравнение. И количество ключей не должно иметь значения, просто нужно увидеть, существует ли значение этого ключа в любом месте другого объекта, а затем установить его свойство с включенным значением «true». –

+0

Вы просто хотите знать, существует ли свойство в обоих объектах ? Или, если свойство и значение для этого свойства одинаковы для обоих объектов? Вы ищете конкретное имя свойства? Или просто любое свойство в 'obj1' также существует в' obj2' на любой глубине объекта? Вы игнорируете какие-либо конкретные имена свойств, которые вы не хотите сравнивать? – jfriend00

ответ

0

Вот функция, которая рекурсивно собирает все свойства в двух объектах, а затем возвращает вам массив любых имен общей собственности между ними. Если .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/

Смежные вопросы