Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用深度比较或json.stringify比较两个对象?_Javascript_Angularjs_Lodash - Fatal编程技术网

Javascript 使用深度比较或json.stringify比较两个对象?

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

我有一个复杂的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 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,我会通过第二个。