我试图找到一种更快的方法来比较两个json对象。目前,我们有一个函数,其中包含大约7个$.each()调用,我认为这是一个非常低效率的方法,但我不知道如何更快地完成它。我将发布比较两个对象的函数,以及两个对象的示例。
这只是来自对象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";
});
}
}
});
}发布于 2014-02-05 17:49:09
下面是一个函数,它递归地收集两个对象中的所有属性,然后返回它们之间任何公共属性名称的数组。如果返回的数组中有.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/
https://stackoverflow.com/questions/21583665
复制相似问题