0

これが私がやろうとしていることです。ユーザーにテキストエリアを提示し、ユーザーが同じドメインに2回入力した場合(重複)、いくつかのドメインを入力する必要があります。重複を削除します。

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

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;
}

これをより良くするための提案は最もありがたいです、また私は重複を取り除く方法がわかりません:(
グーグル私はおそらく「スプライス」を使用しなければならないことがわかりますが、本当にわかりません。

前もって感謝します!
R

(PS申し訳ありませんが、形式がおかしいように見えますが、コードを貼り付けたときに発生しました)

4

5 に答える 5

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;
}

オブジェクトには、それぞれにいくつの重複があったかも含まれます。arrCopyには固有の値があります。

編集:に関するRobGのコメントを参照してくださいhasOwnProperty。この場合、

...
    if(!list.hasOwnProperty(arr[i]))
...
于 2012-01-06T00:59:14.207 に答える
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;
}
于 2012-01-06T02:24:12.630 に答える
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);
于 2012-01-06T00:51:09.193 に答える
0

最初に配列をコピーし、最初に小文字にします

2番目の配列にはjavascriptの「並べ替え」機能があります。比較する前に並べ替えることをお勧めします

3番目にあなたがバブルソートを使用しているのを見ました、それは良いことです。でfor(j=0;j<newtext.length;j++)、0から開始する必要はなく、iから開始できます。

最後に、すでにそこにあるものを使用します、http://api.jquery.com/jQuery.unique/

于 2012-01-06T00:49:41.320 に答える
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(この最後のものはオプションです)

それで:

  if(newtext[j].toLowerCase()==newtext[i].toLowerCase())
      return 'dupe';
于 2012-01-06T01:04:58.600 に答える