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 回答