【问题标题】:Javascript: searching within an array for dupesJavascript:在数组中搜索骗子
【发布时间】:2012-01-06 00:45:21
【问题描述】:

这就是我想要做的: 我向用户展示了一个文本区域,他必须输入一些域,如果他两次输入同一个域(重复),我想删除这些欺骗。

到目前为止,我已经到了可以找到骗子的部分,这是我正在使用的代码:

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

任何能更好地做到这一点的建议将不胜感激,我也不知道如何消除骗局:(
谷歌搜索我发现我可能必须使用“拼接”但不太确定。

提前致谢!
回复

(P.S 对不起,格式看起来很奇怪,但是当我粘贴代码时发生了这种情况)

【问题讨论】:

    标签: javascript arrays search splice


    【解决方案1】:

    这是我微弱的尝试。类似于

    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]))
    ...
    

    【讨论】:

    • 很好,但是你应该使用list.hasOwnProperty(arr[i]),因为字符串是任意的,并且有可能(尽管域名可能不是很高)匹配一个内置的对象方法,例如var arr = ['toString','valueOf']; -> arrCopy.length = 0.
    【解决方案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;
    }
    

    【讨论】:

    • Joseph Marikle 的答案使用一个对象来检查重复项,但返回一个新数组,该数组完全保持原始数组的顺序(假设存在重复的地方 first 一个是保留在新数组中的那个)。
    • 是的,但它不使用 for..in,尽管它确实应该使用 hasOwnProperty 过滤器,因为要测试的字符串是任意的。 ;-)
    • 支持您的答案,会选择它,但我已经使用其他答案作为我的代码,将保留您的作为备份(也支持您的 cmets)谢谢!
    • @Ryan 您仍然可以将接受的答案更改为 RobG 的。我不会介意的。 :) 另外,Rob 的回答看起来比我的要可靠得多,也不那么骇人听闻。 :P 我认为将实际的“最佳答案”标记为解决方案很重要,这样未来遇到该问题的开发人员就会获得最显眼的最佳答案。 :)
    • Joseph — 你的答案作为公认的答案很好,我只是提供了一个使用通用唯一函数的替代方案,否则我会建议你使用 hasOwnProperty测试。
    【解决方案3】:

    您可以使用称为关联数组的东西来解决这个问题。看看它是否适合你。

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

    【讨论】:

    • OP 想要计算那里有多少骗子。您的方法可以删除欺骗,但不能计算它们。
    • 我不介意删除复制品而不计算它们,只要剩下一个原始文件(它不应该删除所有实例!)
    • @EricYin,我在问题的任何地方都没有看到计数(除了代码)。 Ryan 正在使用 count 来检测重复项,如果我没记错的话,他对这个数字不感兴趣 :-)
    • 这是一个关于它的 SO 问题,答案中有很多信息:stackoverflow.com/q/500504/615754(对不起,我没有时间寻找外部文章,但我相信你可以用 Google 找一些。)
    • @KrishnaBharadwaj — for..in 不应该在数组上使用迭代,因为 1) 属性可能不会以任何特定顺序返回 2) 向 Array.prototype 添加方法是相当普遍的,这将是由循环返回 3) 如果未使用 Array 的特殊属性,则应使用普通 Object。但是,仍然存在适合 for..in 的情况,例如稀疏数组,只要采取措施来处理上述问题。
    【解决方案4】:

    第一 复制数组,先小写

    第二 数组在javascript中有一个“排序”功能,我建议你在比较之前先排序

    第三 我看到你正在使用冒泡排序,这很好。在for(j=0;j&lt;newtext.length;j++),不需要从0开始,可以从i开始

    最后,使用已经存在的东西,http://api.jquery.com/jQuery.unique/

    【讨论】:

    • 我不能使用 jQuery,这将进入一个 firefox 插件。您能否复制并更改我的代码,以便我更好地理解,我不擅长 JS
    【解决方案5】:

    我认为这里有一个错误..

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-12
      • 2016-11-08
      • 2020-02-01
      • 2011-10-16
      • 2017-03-26
      • 1970-01-01
      • 2020-07-11
      • 2011-09-12
      相关资源
      最近更新 更多