您非常接近正确答案!只需要对总数(result
)进行累加而不是赋新值。
更改摘要:
因此,不是简单地赋值:
result[currentElement] = parseInt(currentCount);
您应该将当前计数添加到累计总和中。
result[currentElement] = (result[currentElement] ?? 0) + parseInt(currentCount);
如果结果不存在,则将其视为零。请注意,这个更改需要在两个地方都进行。
另外,检查字符是否相同的分支是不必要的,您可以移除该检查及其后面的代码块。
} else if (char === nextChar) {
完整示例:
<p><div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false">
<div class="snippet-code">
<pre class="snippet-code-js lang-js prettyprint-override"><code>function parseChemicalCompound(chemical) {
let result = {};
let currentElement = "";
let currentCount = ""; // 初始化为字符串以处理前导数字
for (let i = 0; i < chemical.length; i++) {
let char = chemical[i];
let nextChar = i < chemical.length - 1 ? chemical[i + 1] : ""; // 安全访问下一个字符
if (char >= "A" && char <= "Z") {
// 处理元素完成
if (currentElement !== "") {
if (currentCount === "") currentCount = "1"; // 如果没有计数则默认为1
result[currentElement] = (result[currentElement] ?? 0) + parseInt(currentCount);
}
currentElement = char;
currentCount = ""; // 重置新的元素
} else if (char >= "a" && char <= "z") {
currentElement += char; // 处理多字母元素
} else if (!isNaN(parseInt(char))) {
currentCount += char; // 追加用于计数的数字
} else {
// 可选地处理无效字符
console.warn(`Invalid character: ${char}`);
}
}
// 处理最后一个元素
if (currentElement !== "") {
if (currentCount === "") currentCount = "1"; // 如果没有计数则默认为1
result[currentElement] = (result[currentElement] ?? 0) + parseInt(currentCount);
}
return result;
}
console.log(parseChemicalCompound("COOH"));</code></pre>
</div>
</div>
</p>