2013-05-13 7 views
8

潜在的に非常に大きなネストされた2つの大きなJavaScript配列があります。 1つは現在のもので、もう1つはこの配列の前の繰り返しです。関数は、異なる要素をすべて見つけ出し、変更されたものに作用する必要があります。Javascript異なるネストされた配列要素をすべて見つけるためのベストプラクティス

私はこれを行うための関数を作成する方法を知っています。そのようなことを行うためのベストプラクティスが何であるかは不思議です。良いアドバイスをいただければ幸いです。私は、異なる要素への応答を扱うjQueryでのネイティブJavaScriptの使用を検討しています。

この質問はいくつかのことを扱っています。

  1. オブジェクトを比較する最も効率的な方法は何ですか。 javascriptのチェックでは、ifが等しいかどうかにかかわらず、objectが等しいかどうかは同じですが、常にそうではないと言います。したがって、オブジェクトを分解して比較する必要があります。

  2. 結果を返す最もよい方法は何ですか?あなたは違いの配列を作っていますか?最初の配列に行っている間、最初の配列と同じオブジェクトをクリアするか、まったく新しい配列を返して返しますか?

+0

lodashライブラリはそれをどうしているのかチェックしてください.https://github.com/bestiejs/lodash – lucuma

+0

2つの要素を比較すると異なる要素が表示されます。または、2つの配列に含まれる配列のうち、順序とは関係のないものを探していますか?おそらくあなたは現在何をしているのかを示すことができ、ベストプラクティスの意見を得ることができます。残念なことに、この質問は現在、「本当の質問ではない」シンドロームに悩まされています。 – Xotic750

+0

["Javascript配列を使用して設定差を計算する最も早く、最も洗練された方法は何ですか?"](http://stackoverflow.com/questions/1723168/what-is-the-fastest-ormost-elegant 「javascriptを使用した差異の計算」および「JavaScript配列の差異」(http://stackoverflow.com/questions/1187518/javascript-array-difference)を参照してください。 –

答えて

1
function CompareArrays(arr1, arr2){  
    for(var key in arr1){ 
     if(arr1[key] !== arr2[key]){ 
      // traverse into nested array 
      if(typeof(arr1[key]) == 'object' || typeof(arr2[key]) == 'object'){     
       CompareArrays(arr1[key], arr2[key]); 
      } 
     }else{ 
       delete arr2[key]; 
     } 
    } 
} 

var a1 = [1,2,3,["a","b","c"],4,5,6,["d","e","f"]]; 
var a2 = [1,2,5445,["a","tt","c"],4,5,336,["d","edee","ffdf"], 'blablabla', 'I\'m extra']; 

CompareArrays(a1, a2); 
console.log(a2); 

これは、与えられた秒を見ていきます。それを修正して、共有されている等価な値を削除します。配列は元のままですが、同じ値は未定義です。

0

個人的には、再帰はこの状況の良い習慣だと思います。

console.clear(); 
// Compare 2 nested arrays, do something if values don't match 
function CompareArrays(arr1, arr2){ 

    for(var i=0;i<arr1.length;i++){ 
     if(typeof arr1[i] === "object"){ 
      // traverse into nested array 
      CompareArrays(arr1[i], arr2[i]); 
     }else{ 
      if (arr1[i] != arr2[i]){ 
       // do something! 
       console.log("mismatch @ "+ i +" a1: "+arr1[i]+" a2: "+ arr2[i]); 
      } 
     } 
    } 
} 

var a1 = [1,2,3,["a","b","c"],4,5,6,["d","e","f"]]; 
var a2 = [1,2,55,["a","tt","c"],4,5,6,["d","e","f"]]; 

CompareArrays(a1, a2); 

作業フィドル:http://jsfiddle.net/ymSmP/5

+0

これは、a1のすべてのキーがa2にあることを前提としています。そして、a2には異なるキーがありません。もちろん、 – Iscariot

+0

はい。配列が異なるサイズであるとは言わなかった。 – carrabino

関連する問題