javascript - 有没有相当于.Contains of c#的js
问题描述
在c#中,我创建了一个元音数组,然后用它来比较字符串是否包含数组的任何元素,但我不知道如何在JavaScript中做到这一点。我使用 .Contains() 来查找下一个字符是否string word
是元音。如果单词的下一个字符是元音,则将其设为大写并连接到string result
,否则,只需将其连接到string result
而不更改大小写。
这是我在 C# 中的实现:
static string Reverser(string word)
{
//string[] vowels = { "a", "e", "i", "o", "u" };
List<string> vowels = new List<string>{ "a", "e", "i", "o", "u" };
string result = "";
for (int i = word.Length-1; i >= 0; i--) {
if (vowels.Contains(word[i].ToString()))
{
result += word[i].ToString().ToUpper();
}
else
{
result += word[i].ToString();
}
}
return result;
}
我尝试进行研究,但搜索只告诉我包含。
解决方案
在c#中,我创建了一个元音数组,然后用它来比较字符串是否包含数组的任何元素,但我不知道如何在JavaScript中做到这一点。
与其直接让你的算法(使用元音数组作为字符串)适应 JavaScript,我觉得向你展示一个更快的算法会更好。
一般而言,索引向量类型结构(如.NET中的Array
、ArrayList
和相同的“包含”操作。List<T>
O(n)
Dictionary<TKey,TValue>
HashSet<T>
O(1)
所以算法应该这样做:
- 预先生成一组已知元音(在数学意义上)。
- 对于字符串中的每个字符,检查该字符是否在步骤 1 的集合中。
- (从你的代码,但不是你的帖子,我看到你构建了一个新的输出字符串,其中元音大写 - 这可以用 a
StringBuilder
而不是有效地完成,String +=
因为它避免了过多的字符串分配和缓冲区复制操作)。
这是 C# 中的算法:
String word = "hello, world.";
HashSet<Char> vowels = new HashSet<Char>( new[] { 'a', 'e', 'i', 'o', 'u' } );
StringBuilder output = new StringBuilder();
foreach( Char c in word )
{
if( vowels.Contains( c ) ) sb.Append( Char.ToUpper( c ) );
else sb.Append( c );
}
在 JavaScript 中没有(更新:现在有),也没有HashSet<T>
类型Char
值(只有strings
,string.charAt
函数返回一个单字符串值)。但是,在 Javascript 中,所有Object
2 个值都是键控字典,具有(理想情况下)O(1)
按名称查找成员 - 因此您可以使用 newObject
将一组已知元音存储为键(具有虚拟整数值),然后遍历每个字符细绳。JavaScript 的另一个不幸的怪癖是缺少 a StringBuilder
,因此我们必须坚持使用+=
连接(尽管一些 JS 环境确实使用内部类似 StringBuilder 的特性对其进行了优化,但这不是 ECMAScript 语言规范的一部分):
var vowels = { 'a': 0, 'e': 0, 'i': 0, 'o': 0, 'u': 0 };
var word = "hello, world.";
var output = "";
for( var i = 0; i < word.length; i++ ) {
var c = word.charAt( i );
if( c in vowels ) { // this operation is O(1)
// character is a vowel
output += c.toUpperCase();
}
else {
output += c;
}
}
2:JavaScriptObject
和 .NETSystem.Object
完全不相关,只是简单地共享相同的名称。在 .NET 中,它是所有引用类型的通用超类,而在 JavaScript 中,它是名称/值集合结构。
推荐阅读
- javascript - 如何动态添加相同输入已输入文本框的次数?
- android - 从 Android Studio 中的 apk 中排除模块
- windows - 如何在智能卡子系统架构中自定义加密服务提供程序(基本 CSP)
- graphql - 子解析器上的 NestJS x Graphql x Typegoose 问题
- unreal-engine4 - Modding Unreal Engine 4官方游戏,修改.uasset
- r - 如何从 R 中变量的开头和结尾删除多个字符?
- selenium - 关于黄瓜硒中的并行执行
- r - 分组条的重新排序
- python - 使用 mode() 将列中的 nans 替换为 Dtype=object 有什么好处?
- angular - gitlab-ci.yml 添加开发配置角度