如果存在则递增一个集合

incrementing a set if existing

我有一个字符串“abacabad”作为 s

传递到我的函数

我想做的事情:

我的代码正在记录什么:

设置(0){a:1,b:1,c:1,d:1}

它应该记录什么:

设置(0){a:4,b:2,c:1,d:1}


function solution(s) {
  arr = new Set()
  for (e of s) {
    if (e in arr) {
      arr[e]++;
    }
    if (arr.has(e) == false) {
      arr[e] = 1;
    }
  }
  console.log(arr)
}

solution('abacabad');

一个 Set 是唯一元素的集合。这不是 Map (key/value) 商店。

该代码中存在大量问题,因此我不会一一列举,但您只是没有使用正确类型的对象,然后混合了 API,特别是定义了混合对象的键与实际 Set 的 API.

function solution(s) {
  const countByChar = new Map();
  for (char of s) {
    const count = countByChar.get(char) || 0;
    countByChar.set(char, count + 1);
  }
  return countByChar;
}

const countByChar = solution('abacabad');

console.log(Array.from(countByChar.entries()));

您将两种不同的数据结构混为一谈:

  • 集,仅是 值的集合(例如 ('a, 'b', 'c', 'd')
  • 对象,是键值对的集合(例如{ a: 1, b: 2 }

设置方法包括.has.add。但集合也是对象,因此您也可以对它们使用标准对象 属性 赋值 - 但您不应该。如果您想要一个 Set,请使用 Set 方法(并且仅使用 Set 方法)来收集其上的数据。在这里,您将 属性 直接放在 Set 对象上(使用 arr[e] =),但您使用的是 Set 方法 .has,它检查的内容完全不同。 .addhas 查看 Set 内部数据结构中的值(除其他 Set 方法外,任何机制都不可见),并且您从不使用 .add,因此您的 Set 永远不会获取放入其中的任何值。

无论如何,Set 在这里都无法正常工作,因为您需要键值对的集合,而不仅仅是值的集合。请改用标准对象或地图。

function solution(s) {
  const obj = {};
  for (const char of s) {
    obj[char] ??= 0;
    obj[char]++;
  }
  console.log(obj);
}

solution('abacabad');

如果你想要一张地图:

function solution(s) {
  const map = new Map();
  for (const char of s) {
    map.set(
      char,
      (map.get(char) || 0) + 1
    );
  }
  console.log([...map.entries()]);
}

solution('abacabad');