首页 > 解决方案 > 有没有相当于.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;
}

我尝试进行研究,但搜索只告诉我包含。

标签: javascriptc#

解决方案


在c#中,我创建了一个元音数组,然后用它来比较字符串是否包含数组的任何元素,但我不知道如何在JavaScript中做到这一点。

与其直接让你的算法(使用元音数组作为字符串)适应 JavaScript,我觉得向你展示一个更快的算法会更好。

一般而言,索引向量类型结构(如.NET中的ArrayArrayList和相同的“包含”操作。List<T>O(n)Dictionary<TKey,TValue>HashSet<T>O(1)

所以算法应该这样做:

  1. 预先生成一组已知元音(在数学意义上)。
  2. 对于字符串中的每个字符,检查该字符是否在步骤 1 的集合中。
  3. (从你的代码,但不是你的帖子,我看到你构建了一个新的输出字符串,其中元音大写 - 这可以用 aStringBuilder而不是有效地完成,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值(只有stringsstring.charAt函数返回一个单字符串值)。但是,在 Javascript 中,所有Object2 个值都是键控字典,具有(理想情况下)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 中,它是名称/值集合结构。


推荐阅读