【问题标题】:Check if string contains set of other string检查字符串是否包含其他字符串集
【发布时间】:2018-08-27 09:51:09
【问题描述】:

我想检查数组中的字符串 1 是否包含字符串 2 中单词的字母。这是我的示例数组:

(["Floor", "far"]);

函数应该返回 false,因为 "a" 不在字符串 "Floor" 中 但是对于这样的数组:

(["Newbie", "web"]);

它应该返回 true,因为来自“web”的所有字母都在“Newbie”中。

这是我目前的代码...

function mutation(arr) {
    var newArr = [];
    for (i=0; i<arr.length; i++) {
        newArr.push(arr[i].toLowerCase().split(""));
    }
    for (i=0; i<newArr.length; i++) {
        for (j=0; j<newArr[i].length; j++) {
            console.log(newArr[0][j]+ (newArr[1][j]));
    }
  }
}
mutation(["Newbie", "web"]);

我知道它行不通,而且我不知道如何制作它。我尝试在两个数组中制作一组所有字母并进行比较。如果至少有一个 false,该函数应该返回 false。我应该在某处嵌套 indexOf() 方法吗?

【问题讨论】:

  • 使用集合应该可以。我在 Google 上搜索了一个库并找到了 JS.set。如果您将“新手”中的所有字母放入 set1 并将“web”中的所有字母放入 set 2,那么您的结果就是 set2.isSubsetOf(set1)。
  • 或者,检查 'web' 中的每个字母在 'newbie' 中是否具有 indexOf > -1。
  • 好的。但是如何使用 indexOf() 使其工作?

标签: javascript arrays string for-loop


【解决方案1】:

如果您想确保一个单词(可能有多个重复字母)包含在另一个单词中,请使用Array.reduce() 来计算字母,并存储创建一个map 的字母 -> 计数。对这两个词都这样做。使用Array.every()检查第二个单词的所有entries是否都包含在第一个单词映射中:

const countLetters = (w) => 
  w.toLowerCase()
  .split('')
  .reduce((r, l) => r.set(l, (r.get(l) || 0) + 1), new Map());

const mutation = ([a, b]) => {
  const al = countLetters(a);
  const bl = countLetters(b);
  
  return [...bl].every(([k, v]) => v <= (al.get(k) || 0));
};

console.log(mutation(["Floor", "far"])); // false

console.log(mutation(["Floor", "for"])); // true

console.log(mutation(["Floor", "foroo"])); // false

console.log(mutation(["Newbie", "web"])); // true

【讨论】:

    【解决方案2】:

    很酷的方法是:

     const mutation =([one, two]) => (set => [...two.toLowerCase()].every(char =>  set.has(char)))(new Set(one.toLowerCase()));
    

    它是如何工作的:

    首先我们将传入的数组解构为第一个单词和第二个单词:

     [one, two]
    

    现在我们得到了两者,我们从第一个单词开始构建一组字符:

     (set => /*...*/)(new Set(one))
    

    在 IIFE 中的所有内容,我们都需要这里的集合:

     [...two].every(char => set.has(char))
    

    这会将第二个单词散布在一个数组中,因此我们得到一个字符数组,然后检查所有字符是否都是我们从另一个单词构建的集合的一部分。

    【讨论】:

      【解决方案3】:

      我认为这应该适合你。将要检查的字母串分解成一个数组。遍历数组获取每个字母并检查传入的字符串是否包含该字母,如果不包含则将结果设置为 false。

      function mutation(arr) {
        var charArr = arr[1].toLowerCase().split("");
        var result = true;
        charArr.forEach(element => {
          if (!arr[0].toLowerCase().includes(element)) {
            result = false;
          }
        });
        return result;
      }
      console.log(mutation(["Newbie", "web"]));
      

      【讨论】:

      • 看起来不错。但是如何使用 indexOf() 方法或 test() 来达到同样的效果?我是 JS 新手,还不知道你在这里使用的这些方法。
      • charArr.forEach 的正文中,你会做类似if (arr[0].toLowerCase().indexOf(element) === -1) 的事情至于测试方法,我个人不会在这里使用它,但我相信你可以在网上的某个地方找到一个例子
      • @icelandico includes 只是做indexOf(...) !== -1的好方法
      猜你喜欢
      • 2019-01-04
      • 2017-05-12
      • 2011-11-09
      • 2013-05-18
      • 1970-01-01
      • 1970-01-01
      • 2019-08-06
      • 2021-12-20
      • 2014-09-17
      相关资源
      最近更新 更多