【问题标题】:Javascript: Deep ComparisonJavascript:深度比较
【发布时间】:2016-11-18 22:17:17
【问题描述】:

我正在检查这个问题Javascript Deep Comparison 提问者的解决方案并没有说服我,所以我尝试分析问题并提出了这个问题

var obj = {here: 2};
console.log(deepEqual(obj, obj));
// → true
console.log(deepEqual(obj, {here: 1}));
// → false
console.log(deepEqual(obj, {here: 2}));
// → true
function deepEqual(a,b)
{
  if( (typeof a == 'object' && a != null) &&
      (typeof b == 'object' && b != null) )
  {
     var count = [0,0];
     for( var key in a) count[0]++;
     for( var key in b) count[1]++;
     if( count[0]-count[1] != 0) {console.log('1');return false;}
     for( var key in a)
     {
       if(!(key in b) || !deepEqual(a[key],b[key])) {console.log('2');return false;}
     }
     for( var key in b)
     {
       if(!(key in a) || !deepEqual(b[key],a[key])) {console.log('3');return false;}
     }  
  }
  console.log('a:'+a+' b:'+b);
  return a===b;
}
obj === { here:2 }

此代码未通过最后一次测试(console.log(deepEqual(obj, {here: 2}))),但如果对象具有分别相等的键和值,尽管它们在内存中是不同的实例,但考虑到对象深度相等的逻辑并没有说服我。我的“解决方案”有问题还是错误在于练习的假设?我链接的问题中提到的代码是否有效?

hikinthru 忘记提及的资源 (http://eloquentjavascript.net/04_data.html#exercise_deep_compare)

【问题讨论】:

  • 不清楚你在问什么。你是说你不同意深度平等的含义吗?
  • 这是我要问的部分内容。我提倡的解决方案是错误的还是问题有问题?最后一行表明,对于浏览器,即使对象具有相同的键和它们各自的值也不是严格相等的。如果问题有问题请告诉我,我会删除它。
  • 在确定两个对象具有相同的属性之后,您的函数永远不会执行return true...

标签: javascript object-comparison


【解决方案1】:

“深度平等”,这是您所链接的问题所谈论的内容,“严格平等”是两个不同的东西。正如您所说,“深度平等”意味着“相等的键和相等的值”。对象的“严格相等”意味着“相同的实例”。严格相等意味着深度相等,但对象可以深度相等而不是严格相等。

您的代码效率有些低,因为您只需要一个循环,但如果您在else 块中检查a === b 并在for 循环之后检查return true,它将正确运行。这是因为您应该将对象与字符串和数字等原始值分开处理。为了清楚起见,我删除了一些日志记录,并尝试保持您的风格。

var obj = {here: 2};
console.log(deepEqual(obj, obj));
// → true
console.log(deepEqual(obj, {here: 1}));
// → false
console.log(deepEqual(obj, {here: 2}));
// → true
console.log(obj === { here:2 });
// → false
function deepEqual(a,b)
{
  if( (typeof a == 'object' && a != null) &&
      (typeof b == 'object' && b != null) )
  {
     var count = [0,0];
     for( var key in a) count[0]++;
     for( var key in b) count[1]++;
     if( count[0]-count[1] != 0) {return false;}
     for( var key in a)
     {
       if(!(key in b) || !deepEqual(a[key],b[key])) {return false;}
     }
     for( var key in b)
     {
       if(!(key in a) || !deepEqual(b[key],a[key])) {return false;}
     }
     return true;
  }
  else
  {
     return a === b;
  }
}

【讨论】:

  • 可能带有最大深度指示器,这样会更好。谢谢。
  • a === b 应该是 Object.is(a, b)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
  • 1970-01-01
  • 2012-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
相关资源
最近更新 更多