2010-12-27 5 views
2

こんにちは から重複をクリア:Javascriptが私はこのような特定の国で販売された商品の量をrapresenting javascript配列オブジェクトを、持っている配列オブジェクト

私はあなたが見ることができるよう(重複を避けるために必要
var data = [{'c1':'USA', 'c2':'Item1', 'c3':100}, 
      {'c1':'Canada', 'c2':'Item1', 'c3':120}, 
      {'c1':'Italy', 'c2':'Item2', 'c3':140}, 
      {'c1':'Italy', 'c2':'Item2', 'c3':110}] 

最後の2つの「レコード」は同じ国と同じアイテムを持ちます)、金額を合計します。データベースからデータを取得していた場合は、DISTINCT SUM句を使用しますが、このシナリオではどうなりますか?良いjqueryのトリックはありますか?

あなたはこのように、個別の値のマップとしてオブジェクトを使用することができ
+1

hm。最後の2つのレコードでは、実際にサンプルに同じ項目がありません。 – Tomalak

+0

新しいデータ構造体(Object)(キー=国名、値=残りのデータ)を作成することができます。新しいものを構築している間に構造体にキーが存在するかどうかを確認し、それに応じて合計します。もっといい方法があるかもしれません... –

+0

Thanx Tomalak - 投稿を編集しました。 – franz976

答えて

7

:JavaScriptのオブジェクトは、マップされ、およびプロパティへのアクセス以来極めて共通操作です:の仕組み

var distincts, index, sum, entry, key; 
distincts = {}; 
sum = 0; 
for (index = 0; index < data.length; ++index) { 
    entry = data[index]; 
    key = entry.c1 + "--sep--" + entry.c2; 
    if (!distincts[key]) { 
     distincts[key] = true; 
     sum += entry.c3; 
    } 
} 

まともなJavaScriptの実装では、(プロパティキーのハッシングを使用して)プロパティアクセスを非常に高速にしようとしています。角括弧([])を使用して、名前の文字列を使用してオブジェクトプロパティにアクセスできます。したがって、obj.fooおよびobj["foo"]は、両方ともfooプロパティがobjであることを示します。

そしてそう:

  1. 我々はプロパティを持たないオブジェクトで始まります。
  2. 配列をループするときに、c1c2からユニークキーを作成します。 "--sep--"文字列は、c1またはc2に表示されないでないものであることが重要です。大文字と小文字の区別がない場合は、.toLowerCaseを送信してください。
  3. すでにdistinctsにそのキーの値がある場合は、これまでに見たことがわかっており、無視できます。そうでない場合は、以前にこのユニークな組み合わせを示していたことを示すフラグとして、の値を追加しますが、false,undefined,0、または""以外の値を追加することができます。合計にc3を追加します。

しかし、誰かが指摘したように、最後の2つのエントリは実際には同じではありません。私はそれが質問の誤植であると推測しています...

+2

+1同じ考え方、あなたはもっと速かった:-) – Tomalak

+2

@Tomalek:高校でタイピングした。 ;-) –

+0

それは動作します。正直言って、私は文字列を連結するより少し難しいと思っていたが、それはおそらくJavaScriptについての私の無知のためです。ありがとう、TJ。 – franz976

0

jQueryはこのための配列関数を持っていますが、2つのイタリアオブジェクトがはっきりと一意ではないため、カスタムソリューションを求めています。あなたは、配列を移入し、あなたが行くように重複していないか確認したい:

var data = [{'c1':'USA', 'c2':'Item1', 'c3':100}, 
      {'c1':'Canada', 'c2':'Item1', 'c3':120}, 
      {'c1':'Italy', 'c2':'Item2', 'c3':140}, 
      {'c1':'Italy', 'c2':'Item1', 'c3':110}] 

var newArray = []; 
var dupeCheck = {}; // hash map 
for(var i=0; i < data.length; i++){ 
    if(!dupeCheck[data[i].c1]){ 
     newArray.push(data[i]); 
     dupeCheck[data[i].c1] = true; 
    } 
} 
-1

test

HTML:

<div id="test"></div> 

JS:

var data = [{'c1':'USA', 'c2':'Item1', 'c3':100}, 
      {'c1':'Canada', 'c2':'Item1', 'c3':120}, 
      {'c1':'Italy', 'c2':'Item2', 'c3':140}, 
      {'c1':'Italy', 'c2':'Item1', 'c3':110}]; 

var 
l = data.length, // length 
f = "",   // find 
ix = "",   // index 
d = [];   // delete  

for (var i = 0; i < l; i++) { 

    ix = data[i].c1 + "_" + data[i].c2 + "__"; 

    //var re = new RegExp(ix); 

    //if (re.test(f)) 
    if (f.indexOf(ix) != -1) 
    d.push(i); 
    else 
    f += ix; 
} 


for (var i1 = 0; i1 < d.length; i1++){ 

    $("#test").append("<div>for delete: "+d[i1]+"</div>"); 

} 

EDIT

chromeははるかに速く動作しますが、chromeでしか動作しませんが、indexOfの例より速く、IE/Opera/Firefox/Safaryではオブジェクトでより速く動作します。

"@ TJ Crowder"によって作成されたコードははるかに効率的です。

+0

Er ...もし 'c1'や' c2'の値にRegExpsで特別な文字が入っていたら? (たとえば、 '*'と考えてください)、あるいは '_'ですか?そして...なぜ正規表現、正確に?これは基本的には次のとおりです。キーで長い文字列を1つ作成します(そのために正規表現は必要ありません)。次に文字列にキーがあるかどうかを調べます。 –

+0

大丈夫、更新します –

関連する問題