【发布时间】: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