我需要比较两个对象,并找出缺少的属性。 对象相当大,有几个级别。
我将给出对象类型的简短示例:
UC = {};
UC.start = {}
UC.start.enableHardEccDecline = '';
UC.start.template = {};
UC.start.template.ecc = '';
UC.start.template.decline = {};
UC.start.template.decline.title = '';
UC.start.template.decline.body = '';
UC.general = {};...
所以这是一个示例对象。我需要比较的只是属性。我不在乎价值。我将把这个对象与另一个非常相似的对象进行比较,但是有些属性可能会丢失。
答案 0 :(得分:3)
function compare(base, compared, deepSearch) {
var missing = [];
var compareProp = function (baseValue, comparedValue, path, deepSearch) {
//console.log('comparing', path.join('.'));
if (comparedValue === undefined) {
console.log('missing key', path.join('.'));
if (!deepSearch) {
return;
}
}
if (typeof baseValue === 'object') {
Object.keys(baseValue).forEach(function (key) {
compareProp(baseValue [key], comparedValue && comparedValue [key], path.concat(key), deepSearch);
});
}
};
Object.keys(base).forEach(function (key) {
compareProp(base [key], compared [key], [key], deepSearch);
});
}
UC = {};
UC.start = {}
UC.start.enableHardEccDecline = '';
UC.start.template = {};
UC.start.template.ecc = '';
UC.start.template.decline = {};
UC.start.template.decline.title = '';
UC.start.template.decline.body = '';
UC.general = {};
compare (UC, {}, true);

答案 1 :(得分:0)
我刚刚在这里做了一个简单的例子,不确定你想要如何应用它,但我已将缺少的项目添加到数组中,该数组正在记录它。
Obj1应该是您的标准比较对象,obj2是从请求中收到的对象。
var obj1 = {};
obj1.test1 = 0;
obj1.test2 = 0;
obj1.test2222 = 0;
obj1.testLoremIpsum = 0;
obj1.lalala = 0;
var obj2 = {};
obj2.test1 = 0;
obj2.test25 = 0;
obj2.lalala1 = 0;
var k , i = 0;
var missingProps = [];
for( i in obj1 )
{
var isFound = false;
for( k in obj2) if( i == k ) isFound = true;
if(!isFound) missingProps.push( i );
}
console.log(missingProps);
答案 2 :(得分:0)
如何使用JSON.stringify
将对象转换为字符串,然后进行字符串比较:
JSON.stringify(UC) === JSON.stringify(UCToBeCompared)
使用此方法,您必须确保对象不具有circular reference,否则JSON.stringify
会抛出异常
答案 3 :(得分:-1)
我在这里做了一个例子。希望它能解决您的问题。它将仅比较对象KEYS
,并返回与比较对象不存在的对象密钥。
var a = Object.keys(obj1);
var b = Object.keys(obj2);
var missing= a.filter(function(v){
return b.indexOf(v)==-1;
})
console.log(missing);
答案 4 :(得分:-2)
如果您的情况允许,我建议使用http://underscorejs.org/库,而不是滚动您自己的解决方案(或查看其实现)。在JS深层对象比较有时并不简单。 如果您决定推出自己的解决方案,则会递归遍历属性并逐个进行比较(忽略本机/内置对象属性,并且可能从某些原型继承)。
如果你愿意,我很乐意详细说明。