2012-01-06 8 views
0

これは私がやろうとしていることです: 彼は同じドメインを二度入力すると(重複して)私は削除したいと思っています。二人組Javascript:複数のューザーの配列内での検索

これまでのところ、私はdupesを見つけることができる部分まで来ている、これは私が使用していたコードです:

function check_if_already_in_the_list___manual_textbox() 
{ 

var therows=0; 
var thetext = document.forms[0].text.value; 
var newtext = thetext.split("\n"); 
therows+=newtext.length; 
var i; 
var match_counter=0; 

    for(i=0;i<newtext.length;i++) // first iterate over the number of items 
    { 
     for(j=0;j<newtext.length;j++) // second, start a second loop to compare each other 
     { 

      if(newtext[j].toLowerCase()==newtext[i].toLowerCase()) 
      {   
      match_counter++; 
      } 

     if(match_counter >=2) // Found dupe! 
     {alert("Matched:"+newtext[j]+" "+newtext[i]+" Counter"+match_counter); 
match_counter=0;} 


     } 
     alert("Match counter:"+match_counter+ " D:"+newtext[i]);' 
match_counter=0; 
    } 
//alert(""+match_counter); 
return match_counter; 
} 

をこれより良いを行うための任意の提案が最もいただければ幸いです、また、私は見当がつかない私はおそらく「スプライス」が、本当にわからないを使用する必要があることを参照グーグルdupes :(
を取り出す方法。

感謝を事前に!
R

(PSソルRYフォーマットは奇妙に見えるが、それは私が

答えて

2

これは私の弱い試みです。

var arr = ["1","2","3","4","5","3","2","3","4"]; 
var arrCopy = []; 
var list = {}; 

for (var i = 0, len = arr.length; i < len; i++) { 
    if(!list[arr[i]]) 
     arrCopy.push(arr[i]); 
    list[arr[i]] = ++list[arr[i]] | 0; 
} 

オブジェクトには、それぞれ1つの複製の数も含まれます。 arrCopyには固有の値があります。

EDIT:RobGのコメントhasOwnPropertyを参照してください。この場合、それは

... 
    if(!list.hasOwnProperty(arr[i])) 
... 
+3

良いですが、文字列は任意であり、(ドメイン名ではあまり高くないかもしれませんが)文字列が組み込みのものと一致する可能性があるので、 'list.hasOwnProperty(arr [i])'オブジェクトメソッド、例えば'var arr = ['toString'、 'valueOf'];' - > 'arrCopy.length = 0'です。 – RobG

+0

@RobG ah!いい視点ね。私はそれについても考えていませんでした。 –

0

第一 コピー配列)のコードに貼り付けたときに起こった、と小文字その最初

第二 アレイは、JavaScriptで「ソート」機能を持って、私はあなたがそれを並べ替える示唆します前に比較する

第3 あなたはバブルソートを使用しているのを見ました。私

最後には、すでにそこに何かを使用してからfor(j=0;j<newtext.length;j++)で、あなたは0から開始する必要はありません、あなたはあなたがこの問題を解決するための連想配列と呼ばれる何かを利用することができhttp://api.jquery.com/jQuery.unique/

+0

私はjQueryを使用できません。これはFirefoxのアドオンになります。 私のコードをコピーして変更することができますので、私はよく分かります。私はJSでうまくいきません。 – Ryan

1

、開始することができます。それがあなたのために働くかどうか見てください。

var initial_array = ['www.yahoo.com', 'www.google.com', 'www.facebook.com', 'www.google.com']; 
var set = {}; 
for (var domain in initial_array){ 
    set[initial_array[domain].toLowerCase()] = true; 
} 
alert(set); 
+0

OPはそこにいくつのくぼみがあるかをカウントしたいと考えています。あなたはメソッドを削除することができますが、それらを数えることはできません。 –

+0

オリジナルを1つ残しておく限り、それらを数えずに削除しても構いません(すべてのインスタンスを削除してはいけません!) – Ryan

+0

@EricYin、質問のどこにでも(コード以外の)カウントが表示されませんでした。 Ryanは、重複を検出するためにcountを使用しています。私が間違っていない場合、彼は数字に興味がありません:-) –

0

である必要があり、私はここに間違いがあると思います。..

for(i=0;i<newtext.length;i++) // first iterate over the number of items 
{ 
    for(j=0;j<newtext.length;j++) // second, start a second loop to compare each other 

このコードはすべきではありません?その後

for(i=0;i<newtext.length -1;i++) // first iterate over the number of items 
{ 
    for(j=i+1;j<newtext.length;j++) // second, start a second loop to compare each other 

ノートj=i+1newtext.length -1(この最後の1はオプションです)

:回答

if(newtext[j].toLowerCase()==newtext[i].toLowerCase()) 
     return 'dupe'; 
2

たくさん。ユニークなメンバーの配列を作成するために汎用ファンクションを使用するものがあります。結果はソートされ、オブジェクトを使用し、for..inを使用してプロパティを取得することは、特定の順序を維持することが保証されないことに注意してください。

var el = document.forms[0].text; 
el.value = unique(el.value.toLowerCase().split(/[\n\r]/)).join('\n'); 

function unique(arr) { 
    arr.sort(); 
    var i = arr.length; 

    while (i--) { 
    if (arr[i] == arr[i - 1]) { 
     arr.splice(i, 1); 
    } 
    } 
    return arr; 
} 
+0

Joseph Marikleの答えは、オブジェクトを使って重複をチェックしますが、元の配列の順序を正確に保持する新しい配列を返します(新しい配列に保持されている_first_が重複しているという前提で動作します)。 – nnnnnn

+1

はい、ただしfor..inは使用しませんが、テストする文字列は任意であるため、実際には* hasOwnProperty *フィルタを使用する必要があります。 ;-) – RobG

+0

あなたの答えをUpvoted、それを選ぶだろうが、私はすでに私のコードとして他の答えを使用して、バックアップとしてあなたのものを維持する(あなたのコメントupvoted)ありがとう! – Ryan