创建对象以在javascript中对字符串中的唯一单词进行计数的函数

时间:2017-03-24 01:22:10

标签: 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
}

它没有计算其中一个。我究竟做错了什么?无法找到与物体相关的任何东西。

谢谢!

3 个答案:

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

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

答案 2 :(得分:0)

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

我不知道为什么你将 j 初始化为-1,它只是创建了一个额外的循环,因为-1处没有元素。

您的逻辑因为您将列表中的每个单词与其他单词进行比较而失败,如果它不匹配,则将其计数设置为1.如果匹配,则递增计数。

但是下一次单词不匹配时,即使之前有其他值,它的值也会重置为1。单词“question”的值为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);

这样 words 对象没有继承属性。结合一些更新的功能,它可以简化为:

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