2016-10-18 29 views
2

我想要实现一个JavaScript程序,通过单词计算并返回该单词以及出现的次数,例如{hello:2,“@hello”:1,world :1,的toString:1}在javascript中计算单词并将其推入对象

以下

是我的代码,但我只得到单词总数

function words(str) { 
    app = {}; 
    return str.split(" ").length; 
} 

console.log(words("hello world")); 
+1

的[JavaScript的组按阵列]可能的复制(HTTP:/ /stackoverflow.com/questions/12873228/javascript-group-by-array) – Andreas

回答

7

使用减少重复的话阵列,并计算实例:

function words(str) { 
 
    return str.split(" ").reduce(function(count, word) { 
 
     count[word] = count.hasOwnProperty(word) ? count[word] + 1 : 1; 
 
     
 
     return count; 
 
    }, {}); 
 
} 
 

 
console.log(words("reserved words like prototype and toString ok? Yes toString is fine"));

+0

非常优雅,我喜欢它。 – ReSpawN

+0

如果我传递toString它会给出一个错误,例如本地函数toString() – Iakhator

+0

您可以添加您使用的代码吗? –

0
function words(str){ 


    var words = []; 

    //check if words list is empty if so then insert the first word into the array 


    if(!words.length){ 
     var word = str.split(" ")[0]; 
     words.push({"word":word, "occurences":1}); 
    } 

    //convert string to array so you can iterate through it 
    str = str.split(" "); 

    //iterate through the array starting from the first position because word at the position 0 is already in the array 
    for(var i = 1; i<str.length; i++){ 

     //iterate through the words list to the see if the word has appeared yet 
     var wordExists = false; 

     for(var j = 0; j<words.length; j++){ 
      if(str[i] == words[j].word){ 

       //word exists in word so count one up 
       words[j].occurences += 1; 

       //used to prevent the word from being inserted twice 
       wordExists = true; 
       break; 
      } 
     } 

     //insert new word in words if it 
     if(!wordExists){ 
      words.push({"word":str[i], "occurences":1}); 
     } 
    } 
    return words; 
} 
0

这是代码,我通过@ori

function words(str) { 
    var adjustedStr = str.replace(/\n|\t|\s\s+/g, ' '); 
    return adjustedStr.split(' ').reduce(function(count, word) { 
    count[word] = (count[word] || 0) + 1; 

    return count; 
    }, {}); 
} 

console.log(words("reserved words like prototype and toString ok?")); 

通过它安慰了

{toString: "function toString() { [native code] }1"} 
+0

检查hasOwnProperty,就像接受的答案一样。但我也做了一个你是用空构造函数创建更简单的对象字面值。 – Keith

0

允许在对象文本保留字不使用hasOwnerProperty,你可以使用Object的空构造函数。

例如。

function words(str) { 
 
    var adjustedStr = str.replace(/\n|\t|\s\s+/g, ' '); 
 
    return adjustedStr.split(' ').reduce(function(count, word) { 
 
     count[word] = (count[word] || 0) + 1; 
 
     return count; 
 
    }, Object.create(null)); 
 
} 
 

 
console.log(words("reserved words like prototype and toString ok?"));

0

一种ES6的办法,减少了在物品,例如一个字符串数组,并返回计数:

const strFrequency = function (stringArr) { 
    return stringArr.reduce((count, word) => { 
     count[word] = (count[word] || 0) + 1; 
     return count; 
    }, {}) 
} 

let names = ["Bob", "Bill", "Bo", "Ben", "Bob", "Brett", "Ben", "Bill", "Bo", "Ben", "Bob", "Ben"]; 

console.log(strFrequency(names)); 
// => {Bob: 3, Bill: 2, Bo: 2, Ben: 4, Brett: 1}