1

2 つのオブジェクトの値が同じかどうかをチェックする関数を作成しようとしています。この関数では、元のオブジェクト内に値として格納されているすべてのオブジェクトが等しいかどうかを確認する必要があります。私が開発したアプローチ (以下のコードを参照) は、最初に非オブジェクト値の等価性をチェックすることです。次に、これらがすべて一致する場合は、オブジェクトを再度反復処理し、元の関数を再帰的に呼び出します。これにより、2 つのオブジェクトのネストされた各レベルを比較できます。

ただし、このアプローチは部分的にしか機能しません。再帰呼び出しの性質上、ネストされたオブジェクトの等価性は、オブジェクトの最初のキーと値のペアでしかチェックできません。ネストされたオブジェクトの最初のセットが比較され、再帰呼び出しが返されると、ネストされたオブジェクトを含む追加のキーと値のペアをチェックする方法がわかりません。関数は次のとおりです。

var deepEqual = function(val1, val2) {
  if (typeof val1 === 'object' && typeof val2 === 'object') {
      for (i in val1) {
        for (i in val2){
          if (typeof val1[i] !== 'object' && typeof val2[i] !== 'object') {
            if (val1[i] !== val2[i]) {
              return false
            }
          }
        }
      }
      for (i in val1) {
        for (i in val2){
          if (typeof val1[i] === 'object' && typeof val2[i] === 'object') {
            return deepEqual(val1[i], val2[i])
          }
        }
      }
    return true
  }
  else if (val1 === val2) {
    return true
  }
  else return false
}

私の基本的な問題は、ネストされたオブジェクトの深い等価性をチェックするために再帰呼び出しが必要であると信じているが、このチェックを正常に実行できるのは 1 回だけだということです。誰もこのような問題を解決しようとしましたか? より具体的なものが必要な場合は、特定のオブジェクトに対する私の結果の例を提供します。ありがとう!

4

3 に答える 3

1

おそらく必要なのはorライブラリ_.isEqualからです。lodashunderscore

アサーション ライブラリdeepEqualからのテストもあります。Chai.js

于 2015-06-28T18:27:24.927 に答える
1

考えられる解決策の 1 つを次に示しますが、独自の解決策を見つけることをお勧めします。

function isEqual(var1, var2) { // Break the comparison out into a neat little function
  if (typeof var1 !== "object") {
    return var1===var2;
  } else {
    return deepEqual(var1, var2);
  }
}

function deepEqual(var1, var2) {
   for (i in var1) { 
      if(typeof var2[i] === "undefined") { // Quick check, does the property even exist?
         return false;
      }
      if (!isEqual(var1[i], var2[i])) {
         return false;
      }
   }
   return true;
}

function areObjectsEqual(obj1, obj2) {
   return deepEqual(obj1, obj2) && deepEqual(obj2, obj1); // Two-way checking
}

obj1のすべてが に存在するかどうかを確認するだけでなく、 のすべてが に存在するobj2ことも確認する必要があります。このソリューションでは、両方の方法で比較を行う必要がありますが、これを大幅に最適化できます。obj2obj1

そしていくつかのテストケース

var v1 = { obj0:"jan", obj:{ name:"jan"}, obj2:"ben" }
var v2 = { obj:{ name:"jan"}, obj2:"ben" }

console.log(areObjectsEqual(v1, v2))

v1 = { obj:{ name:"jan"}, obj2:"ben" }
v2 = { obj:{ name:"jan"}, obj2:"ben" }

console.log(areObjectsEqual(v1, v2))

v1 = { obj:{ name:"jan2"}, obj2:"ben" }
v2 = { obj:{ name:"jan"}, obj2:"ben" }

console.log(areObjectsEqual(v1, v2))

v1 = { obj:{ name:"jan"}, obj2:"ben" }
v2 = { obj:{ name:"jan"}, obj2:"ben", obj3:"pig" }

console.log(areObjectsEqual(v1, v2))
于 2015-06-28T17:07:16.417 に答える