【发布时间】:2020-09-26 20:03:12
【问题描述】:
我正在尝试将重复的字母映射到哈希图中,然后返回字符串中的第一个非重复字符。以下是我为此编写的函数:
export const firstNonRepeatedFinder = (aString: string): string | null => {
const lettersMap: Map<string, number> = new Map<string, number>();
for (let letter of aString) {
if (!lettersMap.has(letter)) {
lettersMap.set(letter, 1);
} else {
incrementLetterCount(letter, lettersMap);
}
}
for (let letter of aString) {
if (lettersMap.get(letter) === 1) return letter;
}
return null;
function incrementLetterCount(
aLetter: string,
aLettersHashMap: Map<string, number>
): void {
if (
aLettersHashMap.has(aLetter) &&
aLettersHashMap.get(aLetter) !== undefined
) {
aLettersHashMap.set(aLetter, aLettersHashMap.get(aLetter) + 1);
}
}
};
但是,在incrementLetterCount 函数中,虽然我正在处理排除undefined 值以在哈希图中获取key,但它仍然抱怨Object is possibly 'undefined',这意味着get 方法可能返回未定义,我无法继续。
有谁知道我在这里遗漏了什么导致此错误?
【问题讨论】:
-
这很奇怪,但
if (aLettersHashMap.has(aLetter) && aLettersHashMap.get(aLetter))有效吗?只是测试它的真实性。 -
然后,您似乎也错过了应该进行初始化的
else { aLettersHashMap.set(aLetter, 1); }案例。 -
@cs95 是的,
if (aLettersHashMap.has(aLetter) && aLettersHashMap.get(aLetter))是真的。我不确定我是否完全理解第二条评论。但是你的意思是在 else 语句中我应该实例化{ aLettersHashMap.set(aLetter, 1); }吗?更多细节:else { lettersMap.set(letter, 1); incrementLetterCount(letter, lettersMap); }如果是这样,这将始终默认aLetter计数器为 1 -
@cs95 只是另一个更新:即使
aLettersHashMap.get(aLetter)的值是1,当我在递增循环中 console.log() 时,在递增它之前,这意味着它们已被实例化
标签: javascript typescript hashmap