Javascript 使用深度比较或json.stringify比较两个对象?
我有一个复杂的JSON对象,我想进行如下比较:Javascript 使用深度比较或json.stringify比较两个对象?,javascript,angularjs,lodash,Javascript,Angularjs,Lodash,我有一个复杂的JSON对象,我想进行如下比较: $scope.new = [ { "name": "Node-1", "isParent": true, "text" : [ { "str" : "This is my first Node-1 string", "parent":[] }, { "str" : "This is my second Node-1
$scope.new = [
{
"name": "Node-1",
"isParent": true,
"text" : [
{
"str" : "This is my first Node-1 string",
"parent":[]
},
{
"str" : "This is my second Node-1 string",
"parent":[]
}],
"nodes": [
{
"name": "Node-1-1",
"isParent": false,
"text" : [
{
"str" : "This is my first Node-1-1 string",
"parent":[]
},
{
"str" : "This is my second Node-1-1 string",
"parent":[]
}],
"nodes": [
{
"name": "Node-1-1-1",
"isParent": false,
"text" : [
{
"str" : "This is my first Node-1-1-1 string",
"parent":[]
},
{
"str" : "This is my second Node-1-1-1 string",
"parent":[]
}],
"nodes": []
}
]
}
]
}
]
但在比较时,我也想忽略1个属性,但由于我使用的是Angular.js,我在Angular.equal
中看不到任何选项,在比较2个对象时会忽略该属性
console.log(angular.equals($scope.new,$scope.copy));
所以,在进行研究时,我得到了以下答案,即使用lodash具有发射选项,但问题是我想忽略创建副本,我想在使用lodash的情况下,我会有性能下降
所以现在我想把对象转换成字符串,然后进行比较,我想这会很快,但问题是,在字符串比较时,我如何省略那个属性呢
大概是这样的:
var str1 = JSON.stringify(JSON.stringify($scope.new));
var str2 = JSON.stringify(JSON.stringify($scope.copy));
console.log(str1==str2);
注意:在比较2个对象时,我想忽略isParent
属性
console.log(angular.equals($scope.new,$scope.copy));
比较2对象的最佳方法是什么?如果使用以下方法,可以使用lodash并覆盖用于深度比较的标准比较器:
var objA={
是的,
傅:{
我的父母:错,
酒吧:“foobar”
}
};
变量objB={
我的父母:错,
傅:{
是的,
酒吧:“foobar”
}
};
var比较器=功能(左、右、键){
if(key==='isParent')返回true;//如果key为'isParent',则将值标记为相等
else返回未定义;//else返回默认行为
}
var isEqual=u.isEqualWith(objA、objB、比较器);
console.log(等质量);//正确
在这些情况下,转换为字符串不是最好的方法。
将它们作为对象保存
使用loadash:
const propertiesToExclude = ['isParent'];
let result = _.isEqual(
_.omit(obj1, propertiesToExclude),
_.omit(obj2, propertiesToExclude)
);
使用纯AngularJS创建对象的副本,删除不需要的属性,然后比较它们:
let firstObj = angular.copy(obj1);
let secondObj = angular.copy(obj2);
const propertiesToExclude = ['isParent'];
function removeNotComparatedProperties(obj) {
propertiesToExclude.forEach(prop => {
delete obj[prop];
});
}
removeNotComparatedProperties(firstObj);
removeNotComparatedProperties(secondObj);
angular.equals(firstObj, secondObj);
是否仅在顶部对象上忽略
isParent
,或者在比较时也在所有嵌套对象上?@guillermoratorio:我想在比较时忽略所有嵌套对象中的isParent,感谢您对我的帮助,但您是否认为使用lodash进行深度比较会比字符串比较快?性能取决于实现,必须进行测试。我很确定它并不比比较字符串慢,因为序列化本身并不特别快。但除此之外,您还必须在字符串比较过程中忽略isParent
属性,因此实际上它不会为您节省任何东西。好吧,但是如果我想包含2到3个属性,那么如何包含它呢?只需相应地扩展比较器。好吧,如果我想省略像prop1这样的属性,prop2然后我必须为prop1和prop2添加两个条件,就像您为iParent添加的一样?感谢您对我的帮助,但您不认为在angular的情况下,我们添加了2个开销,1即循环和删除属性,然后进行比较。1.哪种解决方案更快:lodash或angukar方法???让我们开始说,对于您正在使用的对象,谈论性能是非常无用的。相同的数组长度,包含要排除用于比较的属性。顺便问一下,你认为loadash在里面做什么?魔术它们循环对象的属性,并将它们与您传入的属性进行检查。和\uuOmit
创建对象自身的副本(如angular.copy
)。我想性能应该是相当相同的,但是如果您想要一个精确的答案,请使用jsperf,设置代码并测试这两种情况的性能:如果是我的情况,我会使用什么?视情况而定。如果我已经在使用或计划在其他地方使用loadash,我会选择loadash解决方案,因为它更紧凑、更短。如果我只是为了它而包括loadash,我会通过第二个。