我正在尝试找到一种比较两个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属性设置为true,以用于所有匹配:
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 :(得分: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;
}