2014-02-05 243 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/