textarea重复字符串检查忽略前导和尾随空格

时间:2013-01-21 03:12:11

标签: javascript duplicates duplicate-removal

用户将在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

3 个答案:

答案 0 :(得分: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 + " ";
       }
    }
}

答案 1 :(得分: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.
}

虽然这不适用于使用句号的连续剧。

答案 2 :(得分: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);
}