如果存在则递增一个集合
incrementing a set if existing
我有一个字符串“abacabad”作为 s
传递到我的函数
我想做的事情:
- 创建一个新集
- 遍历字符串中的每个字母。如果字母存在,我将其递增 1
- 如果它不存在,我们通过将其初始化为 1
来创建集合
我的代码正在记录什么:
设置(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
,它检查的内容完全不同。 .add
和 has
查看 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');
我有一个字符串“abacabad”作为 s
我想做的事情:
- 创建一个新集
- 遍历字符串中的每个字母。如果字母存在,我将其递增 1
- 如果它不存在,我们通过将其初始化为 1 来创建集合
我的代码正在记录什么:
设置(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
,它检查的内容完全不同。 .add
和 has
查看 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');