繁体   English   中英

计算字符串中的唯一单词

[英]Counting unique words in strings

下面我试图给一个函数添加字符串数组,该函数将单词数组添加到单词数组中,如果该单词已经在数组中,则增加count数组中相应元素的计数:

var words = [];
var counts = [];

calculate([a, b]);
calculate([a, c]);

function calculate(result) {
    for (var i = 0; i < result.length; i++) {
        var check = 0;
        for (var j = 0; i < tags.length; i++) {
            if (result[i] == tags[j]) {
                check = 1;
                counts[i] = counts[i] + 20;
            }
        }
        if (check == 0) {
            tags.push(result[i]);
            counts.push(20);
        }
        check = 0;
    }
}

然而输出结果如下:

words = a,b count = 2,1

当我期望它是:words = a,b,c count = 2,1,1

在此先感谢您的帮助

将问题分解为具有良好名称的方法可帮助您计算出逻辑。

试试这个:

<script type="text/javascript">
var words = [];
var counts = [];
calculate(["a", "b"]);
calculate(["a", "c"]);
console.log(words);
console.log(counts);

function calculate(result) {
    for (var i=0; i<result.length; i++) {
        if (array_contains(words, result[i])) {
            counts[result[i]]++;
        } else {
            words.push(result[i]);
            counts[result[i]] = 1;
        }
    }
}

function array_contains(array, value) {
    for (var i=0; i<array.length; i++)
        if (array[i] == value)
            return true;
    return false;
}

</script>

输出:

[“a”,“b”,“c”]
[]
a2
b 1
c 1

有些事情是错的,这是工作代码:

var words = [];
var counts = [];

calculate(["a", "b"]);
calculate(["a", "c"]);

function calculate(result) {
    for (var i = 0; i < result.length; i++) {
        var check = 0;
        for (var j = 0; j < words.length; j++) {
            if (result[i] == words[j]) {
                check = 1;
                ++counts[j];
            }
        }
        if (check == 0) {
            words.push(result[i]);
            counts.push(1);
        }
        check = 0;
    }
}

Jsbin: http ://jsbin.com/hawaco/2/edit?js,console

我改变的事情:

  • 更改了数组文字以提供字符串而不是变量名称: [a,b]["a","b"]
  • words替换tags实例(可能是旧名称)
  • 将20s改为1s
  • 使counts[j]的增量更清晰
  • 固定使用i / j索引

需要考虑的事项:

  • 也许这是一个字典而不是一对数组: {"a":1, "b":2} ,这将使更简单的代码
  • 传入数组的名称以允许其他累加器,或将方法和数组组合成单个对象

简化:

var seen = {};

count(["a", "b"], seen);
count(["a", "c"], seen);

function count(words, accumulator) {
    for (var i = 0; i < words.length; ++i) {
        if(!accumulator.hasOwnProperty(words[i])) {
          accumulator[words[i]] = 1;
        } else {
          ++accumulator[words[i]];
        }
    }
}

结果:

>> seen
[object Object] {
  a: 2,
  b: 1,
  c: 1
}

JSBin: http ://jsbin.com/halak/1/edit?js,console

请检查一下:你可以测试一下: http//jsfiddle.net/knqz6ftw/

var words = [];
var counts = [];

calculate(['a', 'b']);
calculate(['a', 'c']);
calculate(['a', 'b', 'c']);

function calculate(inputs) {
    for (var i = 0; i < inputs.length; i++) {
    var isExist = false;
    for (var j = 0; j < words.length; j++) {
        if (inputs[i] == words[j]) {
            isExist = true
            counts[i] = counts[i] + 1;
        }
    }
    if (!isExist) {
        words.push(inputs[i]);
        counts.push(1);
    }
    isExist = false;
}
}

console.log(words);
console.log(counts);

输出是:

["a", "b", "c"] (index):46
[3, 2, 2] 

这是我的解决方案(使用对象):

  const checkWord = (str) => {
    let collection = {};
    // split the string into an array
    let words = str.split(' ');
    words.forEach((word) => {
     collection[word] = word;
   });
   // loop again to check against the array and assign a count
   for (let j = 0; j < words.length; j++) {
     if (words[j] === collection[words[j]]) {
       collection[words[j]] = 0;
     }
     collection[words[j]]++
   }
   console.log(collection);
 };

你也可以使用reduce

  const checkWord = (str) => {
  let collection = {};
  let words = str.split(' ');
  words.forEach((word) => {
     collection[word] = word;
   });
  for (var i = 0; i < words.length; i++) {
    if (words[i] === collection[words[i]]) {
      collection[words[i]] = 0;
    }
  }
  let total = words.reduce((occurrences, word) => {
    collection[word]++
    return collection;
}, 0);
    console.log(total);
  };

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM