【问题标题】:How to count duplicate words in array and add a count number to EACH word?如何计算数组中的重复单词并为每个单词添加一个计数?
【发布时间】:2016-06-01 22:23:40
【问题描述】:

我的目标是转身

['sara', 'mike', 'sara','sara','Jon'] 

进入

'sara', 'mike', 'sara(1)','sara(2)' 'Jon'

我在计算重复总数时看到了一些解决方案,但是,我找不到任何我想做的事情..

ps。我不能使用 sort(),因为名称应该保留在原始数组中的位置..

我尝试使用常规的 for 循环,但没有任何效果,我也认为 map 方法可能会很好,但不知道该怎么做。

谢谢!

编辑:

我实际上是在这里想出这个的:

function words(arr){
  var result=[];
  var count=0;
 for (var i=0; i<arr.length; i++){
    if (result.indexOf(arr[i])==-1){
    result.push(arr[i]);    
    }
    else {
        count++;
        result.push(arr[i]+"("+count+")");
    }

 }
 return result.join(',');
}

words(['sara', 'mike', 'sara','sara','Jon'] );

它可以工作,只是它返回 'sara,mike,sara(1),sara(2),Jon' 而不是 'sara','mike,'sara(1)','sara(2)','乔恩

有人知道怎么改吗?我已经尝试过加入、拆分等..

【问题讨论】:

  • 如果您找到了计算重复项的解决方案,那么您不能在计数大于 1 时修改字符串吗?
  • 不,它不起作用或者我不知道如何使它起作用。
  • 然后展示您尝试过的内容,以便我们帮助您了解您犯错的地方。
  • @javascripting 试试这样的jsfiddle.net/Lg0wyt9u/934
  • 请注意,您的解决方案仅在只有一个名称重复时才有效,但如果有多个名称重复,您的解决方案将失败(即['sara','mike', 'sara', 'mike']

标签: javascript loops dictionary count


【解决方案1】:

试试这个:

function countWords (words) {
    var wordsCounter = {}, results = [];
    words.forEach(function (word) {
        if (!wordsCounter.hasOwnProperty(word)) {
            results.push(word);
            wordsCounter[word] = 1;
        }
        else {
            results.push(word + '(' + (wordsCounter[word]++) + ')');
        }
    });
    return results;
}    

【讨论】:

    【解决方案2】:
    var nameArr = ['sara', 'mike', 'sara','sara','Jon'];
    var nameTrack = {};
    var resultArr = nameArr.map(function(name) {
      if(typeof nameTrack[name] === 'undefined') {
        nameTrack[name] = 0;
        return name;
      }
      return name + '(' + ++nameTrack[name] + ')';
    });
    

    几点说明:

    您不能只在第 4 行使用 nameTrack[name] 转换为布尔值,因为 0 是不真实的。

    ++nameTrack[name] 之前,因此递增首先发生。如果你把它放在后面,数字只会在字符串形成后增加。

    Map 是一个数组函数,它获取数组的每个值,对其进行修改,然后将其返回给数组。见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map

    【讨论】:

    • 您忘记将map 函数返回的新数组分配给某个变量(即var result = nameArr.map(...);
    【解决方案3】:

    这是一个常规循环解决方案。测试并得到您预期的结果

    var myArray = ['sara', 'mike', 'sara','sara','Jon'] 
    
                    var arrayResult = [];
    
                    for (var i=0;i<myArray.length;i++)
                    {
                        arrayResult.push(countPlease(i));
    
                    }
                    console.dir(arrayResult);
                    //'sara', 'mike', 'sara(1)','sara(2)' 'Jon'
    
                function countPlease(index)//index of where you're current at
                {
                    //loop backword
                    var txt = myArray[index]; // don't count
                    var c = 0;
                    for (var i=index-1;i>-1;i--) //don't count itself
                    {
                        if(myArray[i]==txt)
                        {
                            c++
                        }
                    }
                    if(c>0)
                    {
                        return txt+ ' (' + c+')'
                    }
                    else
                    return txt;
    
                }
    

    【讨论】:

      【解决方案4】:

      Here 是一个 JSFiddle,这里有一个解决方案:

      var a = ['sara', 'mike', 'sara','sara','Jon'];
      
      for(var i=0; i<a.length; i++){
          var repeated = 1;
          for(var j=i; j<a.length; j++){
              if(i == j){
              continue;
          }
          if(a[i].toLowerCase() == a[j].toLowerCase()){
              a[j] = a[i]+repeated;
              repeated++;
          }
        }
      }
      

      【讨论】:

      • 你能解释一下 2 个循环 - 和 i=0 和 j=i 吗?据我了解,第一个单词(例如,由于第二个循环,将 sara 与数组中的所有其他单词进行比较,然后将第二个单词与其他所有单词进行比较等 - :i 以 'sara' 开头,j 以我从哪里开始?
      • 为什么不只是 for (var j = i+1;.. 而不是 if (i == j) continue; ? .. 此外,此解决方案的复杂度为 O(n^2),这意味着如果 a = ['mike', 'sara'... &lt;repeat sara millions of times&gt;...];,您将不必要地将 mike 与这些 sara 中的每一个进行比较。
      【解决方案5】:

      对象的帮助下,它会计算字数:

      if(key in obj) { // Found the same word
          ...
          obj[key] += 1; 
      } else { // Only one time found
          ...
          obj[key] = 0;
      }
      

      总共:

      var names = ['sara', 'mike', 'sara', 'sara', 'Jon'];
      
      function countWords(arr) {
          var res = [];
          var obj = {};
      
          names.forEach(function(name) {
              if(name in obj) {
                  obj[name] += 1;
                  res.push(name + "(" + obj[name] + ")");
              } else {
                  obj[name] = 0;
                  res.push(name);
              }
          });
      
          return res.join(",");
      }
      
      var res = countWords(names);
      console.log(res);
      

      【讨论】:

      • 你应该迭代 arr 而不是 names
      【解决方案6】:

      var arr = ['sara', 'mike', 'sara','sara','Jon'];
      var number_detail = {};
      $.each(arr, function(key, val){
        if (typeof number_detail[val] != 'undefined'){
          var cur_count = number_detail[val];
          number_detail[val] = cur_count+1;
          arr[key] = val+'('+number_detail[val]+')';
        }
        else {
          number_detail[val] = 0;
        }
      });

      【讨论】:

      • 真的不需要任何外部库
      • @Russbear,是的,js中的原始for循环可以在这里应用。但只是更喜欢 jQuery
      猜你喜欢
      • 2017-10-22
      • 2013-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      相关资源
      最近更新 更多