2017-03-24 32 views
-1

我试图建立一个计算字符串中的独特单词,并将它们分配到的对象的键/值对的程序。以下是我迄今为止:函数创建一个对象来算,从一个独特的串词在JavaScript

function count(sentence) { 
    var list = sentence.split(' '); 
    var words = {}; 
    for(var i = 0; i < list.length; i++) { 
    for(var j = -1; j < list.length; j++) { 
     if(list[i] !== list[j]) { 
     words[list[i]] = 1; 
     } else { 
     words[list[i]] += 1; 
     } 
    } 
    } 
    return wordCount; 
} 
var display = count('ask a question get a question'); 
console.log(display); 

控制台是给我:

[object Object] { 
    a: 1, 
    ask: 1, 
    question: 2, 
    get: 1 
} 

这还不包括一的之一。我究竟做错了什么?无法找到与对象相关的任何内容。

谢谢!

+0

你为什么要使用2 for循环?我不明白你的方法在这里 –

+0

遍历你的代码。通过它进行谈话。向橡皮鸭或坐在你旁边的人解释一下。在调试器中跟踪它。像在电脑上一样在一张纸上执行它。 –

回答

0

你的代码发布不运行,而不是return wordCount你应该有return words

我不知道你为什么初始化Ĵ为-1,它仅仅是创建一个额外的循环,因为在-1没有元素。

你的逻辑分解,因为你是在列表中的每个字比较其他单词,如果不匹配,设置其计数为1。如果匹配,则增加计数。

但下一次的话不匹配,它的值重置为1,即使是以前一些其他的价值。 “问题”一词的值为2,因为这是最后一个词,并且没有机会重置。

你的逻辑是从根本上打破,因此需要一种新的算法。更常见的做法是走过去的话一次,在遇到每一个字,如果它不是已经在对象,添加它并将其值设置为1。如果它的存在已经,增加数值。

E.g.

function count(sentence) { 
 
    var list = sentence.split(' '); 
 
    var words = {}; 
 
    for (var i = 0; i < list.length; i++) { 
 
    if (!(words.hasOwnProperty(list[i]))) { 
 
     words[list[i]] = 0; 
 
    } 
 
    ++words[list[i]]; 
 
    } 
 
    return words; 
 
} 
 
var display = count('ask a question get a question'); 
 
console.log(display);

这将使用hasOwnProperty测试,你可能会遇到一个词是对象的标准属性。一个替代方案是使用:

var words = Object.create(null); 

使得词语对象没有继承属性。一些较新的功能相结合,它可以简化为:

function count(sentence) { 
 
    return sentence.split(' ').reduce(function(acc, word) { 
 
    acc[word]? ++acc[word] : acc[word] = 1; 
 
    return acc; 
 
    }, Object.create(null)); 
 
} 
 
var display = count('ask a question get a question'); 
 
console.log(display);

0

您正在过度复杂的问题。对于初学者来说,你只需要一个循环遍历所有单词。考虑一下,如果你是在纸上做这件事,那么你只能通过一次这个句子来计算每个字母有多少个实例。

如您遍历,你会检查,看看是否已经通过咨询您的理货表(words.hasOwnProperty)遇到这个词。

一个更好的解决办法是:

function count(sentence) { 
    var list = sentence.split(' '); 
    var words = {}; 
    for(var i = 0; i < list.length; i++) { 
     var word = list[i]; 
     if (words.hasOwnProperty(word)) { 
      words[word]++; 
     } else { 
      words[word] = 1; 
     } 
    } 
    return words; 
} 

var display = count('ask a question get a question'); 
console.log(display); 

这给:

{ 
    "ask":1, 
    "a":2, 
    "question":2, 
    "get":1 
} 
+0

这并不回答这个问题:“*我在做什么错?*” – RobG

0

你似乎有两个循环来这过于复杂。你只需要循环一次单词。如果您的words对象已有该密钥,请将其增加。如果没有,请将其设置为1

function count(sentence) { 
    var list = sentence.split(' '); 
    var words = {}; 
    for (var i = 0; i < list.length; i++) { 
     if(words[list[i]]) { 
     words[list[i]]++; 
     } else { 
     words[list[i]] = 1; 
     } 
    } 
    return words; 
    } 
    var display = count('ask a question get a question'); 
    console.log(display); 
+0

答案时间太近了 – JosephGarrone

相关问题