影响值后,变量始终为0

JSK*_*JSK 1 javascript algorithm hashmap

我正在尝试用字符串创建哈希映射,地图采用以下形式:

{ 'char': charOccurrence }
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

function compress(text) {
  let hash = new Map();
  let prev = [];
  for (let i = 0; i < text.length; i++) {
    let count = 0;
    prev.push(text[i]);
    for (let j = i+1; j < text.length; j++) {
      // if (prev.indexOf(text[j]) !== -1) break;
      if (text[i] === text[j]) {
        count += 1;
        console.log(count);
      }
    }
    hash.set(text[i], count);
  }
  console.log(hash);
}

compress('aaaaahhhheaaadeee');
Run Code Online (Sandbox Code Playgroud)

问题count总是0,我不知道即使在影响for循环中的值之后这是怎么回事.这是我从这段代码中得到的:

Map { 'a' => 0, 'h' => 0, 'e' => 0, 'd' => 0 }
Run Code Online (Sandbox Code Playgroud)

我在这里缺少什么?

use*_*559 5

你正在覆盖以前的结果.

每次看到"a"时,都会从0开始计数并读取字符串的其余部分,然后将所有内容覆盖hash您找到的总计数.字符串中的最后一个"a"将得到总计数0.这就是每个字母都会发生的事情.

prev你没有做任何事情,或许是为了防止这种情况发生.(你可以跳过你已经计算过的字母.)

这是一个更简单(更快)的方法:

function compress(text) {
  let hash = new Map();
  for (let i = 0; i < text.length; i++) {
    hash.set(text[i], (hash.get(text[i]) || 0) + 1);
  }
  return hash;
}

console.log(compress('aaaaahhhheaaadeee'));
// Map { 'a' => 8, 'h' => 4, 'e' => 4, 'd' => 1 }
Run Code Online (Sandbox Code Playgroud)