代码之家  ›  专栏  ›  技术社区  ›  AndrewL64

如何拆分camelCase字符串并检查每个拆分的字是否是数组的一部分?

  •  2
  • AndrewL64  · 技术社区  · 6 年前

    假设我有一个 字串 骆驼壳串 详情如下:

    var arr = ["hello", "have", "a", "good", "day", "stackoverflow"];
    var str1 = "whenTheDayAndNightCollides";
    var str2 = "HaveAGoodDay";
    var str3 = "itIsAwfullyColdDayToday";
    var str4 = "HelloStackoverflow";
    

    我该怎么分这笔钱 camelCase 将单词转换为单个字符串,将每个拆分字符串(转换为小写)与 arr 数组元素和返回 true

    "whenTheDayAndNightCollides" // should return false since only the word "day" is in the array
    
    "HaveAGoodDay" // should return true since all the words "Have", "A", "Good", "Day" are in the array
    
    "itIsAwfullyColdDayToday" // should return false since only the word "day" is in the array
    
    "HelloStackoverflow" // should return true since both words "Hello" and "Stackoverflow" are in the array
    

    SO thread ,我试着使用 every() 方法和步骤 indexOf() 方法测试是否可以在数组中找到每个拆分字符串,如下图所示 代码片段

    var arr = ["hello", "have", "a", "good", "day", "stackoverflow"];
    
    function checkString(wordArray, str)
    {
        // split the camelCase words
        var x = str.replace(/([A-Z])/g, ' $1').split(" ");
    
        return x.every(e => {
            return wordArray.indexOf(e.toLowerCase()) >= 0;
        });
    }
    
    console.log("should return true ->" + checkString(arr, "HelloStackoverflow"));
    console.log("should return false ->" + checkString(arr, "itIsAwfullyColdDayToday"));

    5 回复  |  直到 6 年前
        1
  •  3
  •   jo_va    6 年前

    在进行比较之前,必须将拆分字符串转换为小写。

    replace 当字符串的第一个字母是大写时。

    你可以用 includes 而不是 indexOf

    var arr = ["hello", "have", "a", "good", "day", "stackoverflow"];
    
    function checkString(wordArray, str) {
        return str.replace(/([A-Z])/g, ' $1')
          .split(" ") // split on spaces
          .map(s => s.toLowerCase())
          .filter(s => s)
          .every(e => wordArray.includes(e));
    }
    
    console.log("should return true -> " + checkString(arr, "HelloStackoverflow"));
    console.log("should return false -> " + checkString(arr, "itIsAwfullyColdDayToday"));
        2
  •  3
  •   Shidersz    4 年前

    对于这个特殊情况,我将使用 lookahead assertion (?=...) ,这是一个非捕获构造,我将直接与 String::split() 方法这将解决额外生成的问题 empty string 当字符串以大写字母开头时,数组中的元素。我也会尝试一下 Array::includes() 交换 indexOf()

    const arr = ["hello", "have", "a", "good", "day", "stackoverflow"];
    
    function checkString(wordArray, str)
    {
        return str.split(/(?=[A-Z])/g).every(
            e => wordArray.includes(e.toLowerCase())
        );
    }
    
    console.log(
        "checkString(arr, 'HelloStackoverflow') =>",
        checkString(arr, "HelloStackoverflow")
    );
    console.log(
        "checkString(arr, 'itIsAwfullyColdDayToday') =>",
        checkString(arr, "itIsAwfullyColdDayToday")
    );
    .as-console {background-color:black !important; color:lime;}
    .as-console-wrapper {max-height:100% !important; top:0;}
        3
  •  1
  •   Prince Hernandez    6 年前

    • str.replace ,它返回了类似于 ["", "Hello", "Stackoverflow"] 当字符串开头有大写字母时。

    • 第二个是你的比较 wordArray.indexOf() toLowerCase() 结果是这样的: wordArray.indexOf(e.toLowerCase())

    var arr = ["hello", "have", "a", "good", "day", "stackoverflow"];
    
    function checkString(wordArray, str) {
      var x = str.replace(/([A-Z])/g, ' $1').split(" "); // split the camelCase words
      //filter spaces
      var filtered = x.filter(s => s != '');
      return filtered.every(e => {
        return wordArray.indexOf(e.toLowerCase()) >= 0;
      });
    }
    
    console.log("should return true ->" + checkString(arr, "HelloStackoverflow"));
    console.log("should return false ->" + checkString(arr, "itIsAwfullyColdDayToday"));
        4
  •  1
  •   nvioli    6 年前

    几个问题:首先,所有的问题 arr

    wordArray.indexOf(e)
    

    具有

    wordArray.indexOf(e.toLowerCase())
    

    其次,由于您的第一个测试用例以大写字母开头,所以您的正则表达式在前面加了一个空格,然后 split !e || every 条件,因此对于前导大写生成的空字符串,它将始终返回true。

    var arr = ["hello", "have", "a", "good", "day", "stackoverflow"];
    
    function checkString(wordArray, str) {
        var x = str.replace(/([A-Z])/g, ' $1').split(" "); // split the camelCase words
        return x.every(function (e) { return !e || wordArray.indexOf(e.toLowerCase()) >= 0; });
    }
    
    console.log("should return true ->" + checkString(arr, "HelloStackoverflow"));
    console.log("should return false ->" + checkString(arr, "itIsAwfullyColdDayToday"));
        5
  •  1
  •   Scott Sauyet    6 年前

    这是一个非常简单的版本。

    const checkString = arr => str => str
      .split(/(?=[^a-z])/)
      .every(s => arr.includes(s.toLowerCase()))
    
    const arr = ["hello", "have", "a", "good", "day", "stackoverflow"]
    
    console.log(checkString(arr)('whenTheDayAndNightCollides'))
    console.log(checkString(arr)('HaveAGoodDay'))
    console.log(checkString(arr)('itIsAwfullyColdDayToday'))
    console.log(checkString(arr)('HelloStackoverflow'))

    const correct = checkString(arr)
    correct('HaveAStackoverflowDay') //=> true