1

ユーザーは、さまざまなシリアル番号を に入力しtextareaます。各改行は、新しい連番を示します。いくつかの要件/制限:

  • 先頭および末尾の空白は使用できません。
  • シリアル内の空白は問題ありません。
  • 空白のシリアルは許可されていません
  • JQuery は使用しない方がよいでしょう。
  • 重複を保存して、ユーザーに表示できるようにします。

私のテストに基づいて、私は実用的な解決策を持っています。何かを見逃したり見落としたりしないようにしたい。私の質問は次のとおりです。

  • 重複をチェックするより効率的な方法はありますか?
  • 私のソリューションがキャッチできない明白なテスト ケースはありますか?

実施例: http: //jsbin.com/ivusuj/1/

function duplicateCheck() {
    var output = document.getElementById('Output');
    output.innerHTML = '';
    var duplicateSerials = [];
    var count = 0;
    var textArea = document.getElementById('Serials'); 
    var serials = textArea.value.trim().split(/ *\n */);

    for(var i = 0;i < serials.length;i++){
      var serial = serials[i];

      if(serials.indexOf(serial) != serials.lastIndexOf(serial) && 
         duplicateSerials.indexOf(serial) == -1 && serial !== '') {        
        duplicateSerials.push(serial);
      }  

    }    

  // For testing
  output.innerHTML = '<pre>Serials:\t' + serials.toString() + "<br />" +
                     'Duplicates:\t' + duplicateSerials.toString() + "<br>" +
                     '</pre>';
}

注:上記はクライアント側のチェック用です。同じチェックがサーバー側でも実行され、データが有効であることを確認します。


アップデート

ソリューション比較: http://jsbin.com/ivusuj/4/edit

4

3 に答える 3

2

私はjsfiddle彼女をまとめました:http://jsfiddle.net/wrexroad/yFJjR/3/

実際にそのように重複をチェックするのはかなり非効率的です。

重複をチェックする代わりに、プロパティの名前がシリアルであるオブジェクトにプロパティを追加するだけです。次に、すべてのプロパティ名を出力します。

このように、重複がある場合は、プロパティを作成してから上書きします。

関数は次のとおりです。

function duplicateCheck() {
    var output = document.getElementById('Output');
        output.innerHTML = '';

    var textArea = document.getElementById('Serials'); 
    var inputSerials = 
        textArea.value.trim().split(/ *\n */);
    var outputSerials = new Object();

    for(var i = 0;i < inputSerials.length;i++){
        var serial = inputSerials[i];

        //build an object whose properties are serials
        //if the serial exists, incremint a counter
        if(outputSerials[serial]){
            outputSerials[serial]++;
        }else{
            outputSerials[serial] = 1;
        }
    }    

   output.innerHTML = 
      'Serials: <br />'; 

   for(var i in outputSerials){
      output.innerHTML += i + " ";
   }

   output.innerHTML += 
      '<br /><br />Duplicate Serials: <br />'; 

    for(var i in outputSerials){
    //check to see if we have any duplicates
       if(outputSerials[i] > 1){
           output.innerHTML += i + " ";
       }
    }
}
于 2013-01-21T04:00:30.820 に答える
1

オブジェクトを使用して以前に見たシリアルを判断すると、パフォーマンスが大幅に向上すると思います。これに近いもの:

var seen = {};
for (var i = 0, j = serials.length; i < j; ++i) {
  var serial = serials[i];
  if (seen.hasOwnProperty(serial)) {
    // Dupe code goes here.
    continue;
  }
  // Can't be a duplicate if we get to this point.
}

ただし、ピリオドを使用するシリアルでは機能しません。

于 2013-01-21T03:38:05.910 に答える
0

重複を除外するソリューションを次に示します。

function formatInput() {
    var arrUnique = [], dups = [],
    str = document.getElementById('Serials').value
        .replace(/\r\n?/g,'\n')
        // normalize newlines - not sure what PC's
        // return. Mac's are using \n's
        .replace(/(^((?!\n)\s)+|((?!\n)\s)+$)/gm,'')
        // trim each line
        .replace(/^\n+|\n+$|\n+(?=\n(?!\n))/g,''),
        // delete empty lines and trim the whole string
    arr = str.length ? str.split(/\n/) : [];
    // split each line, if any
    for (var i = 0; i < arr.length; i++) {
        if (arrUnique.indexOf(arr[i]) == -1)
            arrUnique.push(arr[i]);
        else dups.push(arr[i]);
    }
    //document.getElementById('Serials').value = arrUnique.join('\n');
    console.log('serials:', arr);
    console.log('unique:', arrUnique);
    console.log('duplicates:', dups);
}
于 2013-01-21T04:32:19.650 に答える