9

javascriptで連想配列を比較するための質の高い方法をここで検索しました。私が見つけた唯一のまともな解決策は、いくつかの比較配列関数を持つPHP.JSプロジェクトです。唯一の問題は、これらの関数が最初の配列を2番目の配列のキーと見なすことです。私の状況では、少なくとも両方の配列が常に同じ数のキーや同じキーを持っているとは限りません。これにより、関数は、array1には存在しなかったが、array2には存在した可能性のあるキーを含まない結果を出力します。これまで私が考えることができる唯一のことは、引数を反転させてarray_diff_associative()関数を2回実行し、次にそれらを結合することです(最初の引数が2番目の引数のキーとして再び使用されるため問題があるようです)。

助言がありますか?ありがとうございました。

4

3 に答える 3

10

これは古い質問ですが、配列を比較するための Google 検索で最初に出てくるので、配列に同じ値を持つ 2 つの異なるオブジェクトがある場合でも機能する代替ソリューションを投入すると思いました。

function arrays_equal(a, b) {
    return JSON.stringify(a) == JSON.stringify(b);
}

注: これは順序に依存するため、順序が重要でない場合は、いつでも前もって並べ替えることができます。

于 2014-12-11T19:51:21.833 に答える
7

私はあなたが望むことを次のようにすべきだと思います:

function nrKeys(a) {
    var i = 0;
    for (key in a) {
        i++;
    }
    return i;
}
function compareAssociativeArrays(a, b) {
   if (a == b) {
       return true;
   }   
   if (nrKeys(a) != nrKeys(b)) {
       return false;
   }
   for (key in a) {     
     if (a[key] != b[key]) {
         return false;
     }
   }
   return true;
}
于 2009-07-10T02:59:05.607 に答える
2

ブルートフォースアプローチよりも良い方法があるかどうかは本当にわかりません:

function differences(a, b){
  var dif = {};
  for(key in a){ //In a and not in b
    if(!b[key]){
      dif[key] = a[key];
    }
  }
  for(key in a){ //in a and b but different values
    if(a[key] && b[key] && a[key]!=b[key]){
      //I don't know what you want in this case...
    }
  }
  for(key in b){ //in b and not in a
    if(!a[key]){
      dif[key] = b[key];
    }
  }
  return dif;
}

また、それらは配列ではなくオブジェクトであり、一部のプロパティは for..in (Array.length など) を介して列挙できないため、アプリケーションで考慮してください。

于 2009-07-10T10:35:56.553 に答える