是否有一个js等效于。包含c#

时间:2018-07-01 02:15:59

标签: javascript c#

在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;
}

我尝试进行研究,但搜索仅告诉我有关包含的内容。

3 个答案:

答案 0 :(得分:7)

  

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

我认为直接向JavaScript展示算法要好得多,而不是直接使您的算法(使用元音数组作为字符串)适应JavaScript。

通常来说,索引向量类型结构(如.NET中的ArrayArrayListList<T>)对于“包含”测试是不利的,因为程序必须检查每个值匹配(即O(n)时间),而像哈希表(Dictionary<TKey,TValue>)或HashSet<T>这样的结构具有O(1)时间用于相同的“包含”操作。

因此算法应执行以下操作:

  1. 具有一组预生成的(从数学意义上来说)已知的元音。
  2. 对于字符串中的每个字符,请检查该字符是否在步骤1的集合中。
  3. (从您的代码而不是您的文章中,我看到您构建了一个新的输出字符串,其中大写的元音-使用StringBuilder而不是String += {{3}可以有效地完成})。

这是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中,所有Object [2]值都是键字典,按名称(理想情况下)是O(1)成员查找-因此,您可以使用新的Object存储已知的集合元音作为键(具有伪整数值),然后遍历字符串中的每个字符。 JavaScript的另一个不幸之处是缺少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]:JavaScript Object和.NET的System.Object完全无关,除了简单地共享相同的名称。在.NET中,它是所有引用类型的通用超类,而在JavaScript中,则是名称/值集合结构。

答案 1 :(得分:1)

由于您说唯一可以找到的是包括,因此这告诉我您正在寻找其他东西。我认为您正在寻找的是indexOf。您可以使用indexOf查看另一个数组中是否还存在一个数组值。如果是,则返回值索引;如果不是,则返回-1。 这是我写的方式:

  var testWords = [ 'a', 'b', 'c', 'd'];

  function reverser(words){
    var result = '';
    words.forEach((word) => {
      if(testWords.indexOf(word) > -1){
        result += word;
      }
    })
    console.log(result);
  };

  reverser(['b', 'd', 'e', 'z']);

如果您输入一个实际的字符串并且只是想查看每个字母是否是对象中的一个键,那么您可以执行以下操作:

  function reverserObj(word){
    var result = '';
    var splitWords = word.split("");
    var obj = {a:0, e:0, i:0, o:0, u:0};
    splitWords.forEach((letter) => {
      console.log(letter);
      if(obj.hasOwnProperty(letter)){
        result += letter;
      }
    });

    console.log(result);
  }

  reverserObj('hello world');

看看这些非常非常棒的javascript函数。您可以使用这些工具执行各种操作。 note and explanation here

答案 2 :(得分:1)

在js中使用 includes

var hasWord = "this is a sample text.".includes("text");