如何计算数组中的重复单词并为每个单词添加计数?

时间:2016-06-01 22:23:40

标签: javascript loops dictionary count

我的目标是转向

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

进入

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

我在计算重复的总数时看到了一些解决方案,然而,无法找到我正在尝试做的事情。

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

我尝试使用常规for循环,但没有真正有效,我也认为地图方法可能会很好,但无法弄清楚如何做到这一点。

谢谢!

编辑:

我实际上想出了这个:

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&#39;而不是&#39; sake&#39; mike,&#39; sara(1)&#39;,&#39; sara(2)&#39;,&#39; Jon&#39; ;

任何人都知道如何改变它?我已尝试加入,拆分等..

6 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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 :(得分:0)

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

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;

            }

答案 3 :(得分:0)

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

UPDATE news SET article_title="["+id+"]" + article_title;

答案 4 :(得分:0)

借助对象,对单词进行计数:

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

答案 5 :(得分:-2)

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