JavaScript Katas:计算字符串中每个字符的数量
简介🌐
我采用各个级别的有趣的套路并解释如何解决它们。
解决问题是一项重要技能,对您的职业和整个生活都如此。
你最好学会解决问题!
来源
我从不同的来源获取了有关 kata 的想法并重新编写了它们。
今日来源:Codewars
理解练习❗
首先,我们需要了解这项练习!
这是(软件)工程的关键部分。
再次查看练习说明,直到你 100% 理解为止。
不要试图在这里节省时间。
我的方法是:
- 输入:我输入什么?
- 输出:我想要得到什么?
今天的练习
编写一个函数countAmountOfEachCharacter
,接受一个参数:inputString
,一个有效的字符串。
该函数应该返回一个对象。该对象为字符串中至少出现一次的每个字符指定一个键。
每个键的值表示该字符在字符串中出现的次数。
输入:一个字符串。
输出:一个对象,其键为现有字符,值表示该字符在字符串中出现的次数。
思考解决方案💭
我想我理解了这项练习(=我为这项功能投入了什么以及我希望从中得到什么)。
现在,我需要从输入到输出的具体步骤。
我尝试一步步地做到这一点。
- 循环输入字符串
- 如果该字符以前从未出现过,则将其添加到对象中,计数为 1
- 如果该角色之前出现过,则将其计数加 1
- 返回包含每个键值对的对象
例子:
- 输入:
"bee"
- 第 1 轮:
{ "b": 1 }
//下一个字符是“b”,它以前从未出现过,因此将其添加到计数为 1 的对象中 - 第二轮:
{ "b": 1, "e": 1 }
//下一个字符是“e”,它以前从未出现过,因此将其添加到计数为 1 的对象中 - 第 3 轮:
{ "b": 1, "e": 2 }
//下一个字符是“e”,它之前已经出现过,因此将其计数增加 1 - 输出:
{ "b": 1, "e": 2 }
//返回包含每个键值对的对象
实现(for循环)⛑
function countAmountOfEachCharacter(inputString) {
const returnObject = {};
// loop over input string
for (let i = 0; i < inputString.length; i++) {
// check if character has been seen before
if (returnObject.hasOwnProperty(inputString[i])) {
// increase its count by 1
returnObject[inputString[i]] += 1;
} else {
// add it to the object with a count of 1
returnObject[inputString[i]] = 1;
}
}
return returnObject;
}
结果
console.log(countAmountOfEachCharacter("bee"));
// { b: 1, e: 2 }
console.log(countAmountOfEachCharacter("mississippi"));
// { m: 1, i: 4, s: 4, p: 2 }
警告
如果在字符串中使用表情符号,则应避免使用普通的 for 循环。
实现(for of 循环)⛑
function countAmountOfEachCharacter(inputString) {
const returnObject = {};
// loop over input string
for (const character of inputString) {
// check if character has been seen before
if (returnObject.hasOwnProperty(character)) {
// increase its count by 1
returnObject[character] += 1;
} else {
// add it to the object with a count of 1
returnObject[character] = 1;
}
}
return returnObject;
}
结果
console.log(countAmountOfEachCharacter("bee"));
// { b: 1, e: 2 }
console.log(countAmountOfEachCharacter("mississippi"));
// { m: 1, i: 4, s: 4, p: 2 }
实现(功能)⛑
function countAmountOfEachCharacter(inputString) {
// convert the string to an array
return [...inputString].reduce(
(accumulated, currentChar) =>
// check if character has been seen before
accumulated.hasOwnProperty(currentChar)
? { ...accumulated, [currentChar]: accumulated[currentChar] + 1 } // increase its count by 1
: { ...accumulated, [currentChar]: 1 }, // add it to the object with a count of 1
{} // start with an empty object
);
}
结果
console.log(countAmountOfEachCharacter("bee"));
// { b: 1, e: 2 }
console.log(countAmountOfEachCharacter("mississippi"));
// { m: 1, i: 4, s: 4, p: 2 }
游乐场⚽
你可以在这里试用一下代码
下一部分➡️
干得好,伙计!
下次,我们将解答下一个套路。敬请期待!
如果我需要解决特定的 kata,请在这里给我留言。
如果您想阅读我的最新作品,请与我联系!
进一步阅读📖
问题❔
- 你喜欢解决 katas 吗?
- 您更喜欢哪种实现?为什么?
- 还有其他解决方案吗?