2012-02-08 4 views
5

私は2つの配列を持っています。各配列には、多くのプロパティを持つオブジェクトがありますが、メソッドはありません。 配列1が配列2と等しいかどうかを確認する必要があります。オブジェクトの配列を最適に比較する

これを行うには、配列の各要素を通過させ、類似したオブジェクトの各プロパティを比較する関数を作成します2番目の配列の位置。

問題は、配列がかなり大きく、各オブジェクトにも多くのプロパティがあることです。別の方法があれば、私はさまよっていた。例えばC++ではメモリを読み込むことができますが、jsでそれを行う方法はわかりません。

これは頻繁に使用される関数の一部であるため、最も最適な方法を得る必要があります。

+0

[別の値で配列のjavascript配列を比較](http://stackoverflow.com/questions/18657232/compare-javascript-array-of-array-by-distinct-values)このコードはあなたを助けることができます。 – Jugal

答えて

4

同じ配列インスタンスでない限り、メモリ位置の比較はJavaScriptでは機能しません(arr1 == arr2を実行するとどうなりますか)。

明示的にループする必要があります。

一部の人々は、両方の配列に(落とし穴に気をつけpimvdbによってコメントで説明)JSON.stringify()を使用してに結果の文字列を比較をカンニングが、文字列に直列化し、私には十分に高価な上音を比較します。しかし、それは動作するので、パフォーマンスの問題がない場合は、ナットしてください! :)

toSource()でもお試しいただけます。

と同じという私の考えを満たすだけの比較関数を作成します。

+0

パフォーマンスに問題があります:)。私がarr1 ==と比較すると、arr2はメモリの場所が異なるため常にfalseを返します。私は、その場所のメモリを、メモリの中で配列の終わりと比較して、2番目の場所を最後に置くようにする必要があります。 P.S.私の英語を許してください。 – zozo

+2

@zozo JavaScript配列は、実際にはいくつかの特別なメソッドとプロパティを持つオブジェクトです。通常は、他の言語の配列の実装と同様に、順番に格納されません。 – alex

+0

C++でできるだけ直接メモリにアクセスすることはできません。 JavaScriptはちょっとばかげたインターフェースなので、何とかオブジェクトを比較するだけです。 JSON.stringifyも使用します。また、「uneval」もあります。 –

0

jQueryのは、オブジェクト

のクローンを作成するために使用できるオブジェクト

あなたがそうのようなオブジェクトのオブジェクトまたは配列を比較することができますをシリアライズjQuery.param()と呼ばれる機能、それはjQuery.extend()で接続詞では非常に強力です

$.param(originalObj) == $.param(modifiedObj) 

を持っています

1

配列を文字列に変換して文字列を比較すると、O(n)(線形)の平均と最悪のパフォーマンスが同じになります。

オブジェクトのプロパティ/配列をループして1番目の不一致で中止すると、最悪のパフォーマンスはO(n)になりますが、比較するオブジェクトが通常同一でない限り平均パフォーマンスは大幅に向上します。どちらの方法でも、このトラバーサルには新しいオブジェクトの作成やバイトのコピーは含まれないため、同じコンポジットオブジェクト/配列(最悪の場合)を比較しても、それらを文字列化するよりも速いはずです。

this答えはあなただけUnderscore.js isEqualを使用することができ通り:

ドキュメントに応じた:彼らは同じ

考慮すべきかどうかを判断するために、2つのオブジェクト間の最適化された深い比較を実行し、私はかなり確信していますそれも配列のために動作します。

+0

あなたは正しいです。 +1 – zozo

関連する問題