【问题标题】:Common Letters between Two Strings in JavaScriptJavaScript 中两个字符串之间的常用字母
【发布时间】:2018-10-08 21:36:21
【问题描述】:

我正在尝试计算用户的input 和生成的数字之间的常见字母数。我正在计算它,以便它们之间的位置无关紧要(所以 411 和 004 应该说“1 个共同的数字”)。

我已将我的code 放在下面的 sn-p 中。它工作正常,除此之外,当生成的string 有两个相同的数字时,它不能正常工作。你可以看到输入“4”,它会说那里是两个字符。通常,当实际上只有一个时(它会将四个数​​两次。)

所以,毕竟,我要问什么是显示inputgenerated number? 之间常用字母的最佳方式

我可以使用jQuery 和/或JavaScript,如果我的代码不是很好,很抱歉,我一点也不先进。

提前感谢您的帮助! :)

  // on ".check" click...

$(".check").click(function() {
  var nmb = $(".number").text();
  var ltr = $(".input").val();
  var count = $(".cnt");

  // Set logged text to 0
  
  count.text("0");

  // Test for numbers in common

  if (ltr.includes(nmb.charAt(0))) {
    count.html(function(i, val) {
      return val * 1 + 1
    });
  }
  if (ltr.includes(nmb.charAt(1))) {
    count.html(function(i, val) {
      return val * 1 + 1
    });
  }
  if (ltr.includes(nmb.charAt(2))) {
    count.html(function(i, val) {
      return val * 1 + 1
    });
  }
  if (ltr.includes(nmb.charAt(3))) {
    count.html(function(i, val) {
      return val * 1 + 1
    });
  }
  
  $(".res1").html(" numbers in common");
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
Generated Number: <span class="number">4410</span><br><br>
<input type="text" class="input" placeholder="Try typing 4 to see the issue" maxlength="4">
<input class="check" type="submit" value="CHECK">
<br><br>
<span id="full_res">
  <span class="cnt"></span>
  <span class="res1"></span>
</span>

【问题讨论】:

    标签: javascript jquery string increment


    【解决方案1】:

    你可以这样做:

    $(".check").click(function() {
      var nmb = $(".number").text().trim().split('');   //Get the text and convert to string
      var ltr = $(".input").val().trim().split('');     //Get the value and convert to string
      var commonLetters = [];                           //The common letters will be stored on this variable
    
      ltr.forEach(function(v) {                         //Loop thru the user's input letters
        var idx = nmb.indexOf(v);                       //Find its index
        if (idx !== -1) {                               //Check if found
          commonLetters.push(4);                        //If found, push the letters to commonLetters
          nmb[idx] = '';                                //Clear the index
        }
      })
    
      $(".cnt").text(commonLetters.length);
      $(".res1").html(" numbers in common");
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    Generated Number: <span class="number">4410</span><br><br>
    <input type="text" class="input" placeholder="Try typing 4 to see the issue" maxlength="4">
    <input class="check" type="submit" value="CHECK">
    <br><br>
    <span id="full_res">
       <span class="cnt"></span>
       <span class="res1"></span>
    </span>

    【讨论】:

    • 谢谢!我将此标记为答案,因为它是最简单的,符合我的愿望。
    【解决方案2】:

    首先,您可以将每个字符串缩减为仅包含唯一字符,即 4410 可以缩减为 410,因为您不需要多次测试 4。您可以通过为每个字符串创建一个Set 来做到这一点:

    var numberSet = new Set(nmb);
    var inputSet = new Set(ltr);
    

    然后您可以迭代其中一个,以获得最短的迭代次数,并使用has() 方法查看该字符是否在另一个Set

    var counter = 0;
    for(letter of inputSet){
      if(numberSet.has(letter)){
        counter++;
      }
    }
    

    // on ".check" click...
    
    $(".check").click(function() {
      var nmb = new Set( $(".number").text() );
      var ltr = new Set( $(".input").val() );
      var count = $(".cnt");
    
      var counter = 0;
      for(let letter of nmb){
         if(ltr.has(letter)){
           counter++;
         }
      }
      //No need to continually update text / html as each update wont be
      //seen anyway so just set it once outside the loop.
      count.text(counter);
      
      $(".res1").html(" numbers in common");
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    Generated Number: <span class="number">4410</span><br><br>
    <input type="text" class="input" placeholder="Try typing 4 to see the issue" maxlength="4">
    <input class="check" type="submit" value="CHECK">
    <br><br>
    <span id="full_res">
      <span class="cnt"></span>
      <span class="res1"></span>
    </span>

    【讨论】:

    • 这行得通,但是当我输入“44”时,它仍然会说 1,而实际上应该说 2。感谢您的帮助:)
    • @aman.s well 4 和 4 是同一个字符,所以只有 1 个公共字符。如果您希望出现的次数有所不同,我可以对其进行更改以进行更新。
    • @aman.s 实际上会发生什么,那么如果你输入 404,它应该仍然是 3、2 还是 1,因为 nmb 中的 0 和 4 的顺序不同?每个字符串中字符的位置重要吗?
    • 我指定顺序无关紧要,所以输入 404 应该是“3”,因为 2 个四和 1 个零是共同的;)
    • 并且有一个答案将“两个四肢视为一个字符”。问题,不过谢谢!如果你还是想做,我很乐意接受。
    【解决方案3】:

    这并不完全是微不足道的。例如,您不能简单地单独使用 filterincludeshas 测试,因为一旦找到一个字符,您必须将其从 each 集合中删除,这样它就不会' t 再次匹配。每次找到匹配项时,我都会使用 reducesplice 字符数组来删除找到的字符。 (这个不需要jQuery)

    document.querySelector('.check').addEventListener('click', () => {
      const numChars = [...document.querySelector('.number').textContent];
      const inputChars = [...document.querySelector('.input').value];
      const matchingCharCount = inputChars.reduce(
        ({ remainingNumChars = numChars, matchCount = 0 } = {}, inputChar) => {
          if (remainingNumChars.includes(inputChar)) {
            remainingNumChars.splice(remainingNumChars.indexOf(inputChar), 1);
            matchCount++;
          }
          return { remainingNumChars, matchCount };
        }, { remainingNumChars: numChars, matchCount: 0 })
        .matchCount;
      document.querySelector('.cnt').textContent = matchingCharCount;
      document.querySelector('.res1').textContent = " numbers in common"
    });
    Generated Number: <span class="number">4410</span><br><br>
    <input type="text" class="input" maxlength="4">
    <input class="check" type="submit" value="CHECK">
    <br><br>
    <span id="full_res">
      <span class="cnt"></span>
      <span class="res1"></span>
    </span>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-09
      • 2014-11-16
      • 1970-01-01
      • 2014-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多