【问题标题】:Switch numbers in string切换字符串中的数字
【发布时间】:2015-06-19 15:06:26
【问题描述】:

我有一个以空格分隔的唯一数字的字符串,如下所示:

"2 4 13 14 28 33"

需要一种快速有效的方式来转换一对它们的形式:

switchNumbers(2, 28)
// result: "28 4 13 14 2 33"

我可以拆分字符串并搜索值,但这听起来很无聊。有更好的主意吗?

【问题讨论】:

  • 到目前为止,您自己尝试了哪些方法来解决问题?你做过研究吗?您当前的代码有问题吗?
  • 我很无聊,无聊有什么问题!
  • “但这听起来很无聊”——你可能想澄清一下你是如何判断兴奋的,这样我们就知道在哪里给出答案……或者更严重的是,我会采用这种方法,它会起作用,对于你给出的例子来说,甚至不会那么糟糕。你不喜欢那种方法怎么样(我假设“无聊”只是开玩笑)。
  • 你可以改用正则表达式...
  • 所有数字都是唯一的还是可以重复?

标签: javascript jquery swap


【解决方案1】:

您可以利用array 函数而不是strings

见代码中的内联 cmets:

var str = "2 4 13 14 28 33";

// Don't use `switch` as name
function switchNumbers(a, b) {
    var arr = str.split(' ');
    // Convert string to array

    // Get the index of both the elements
    var firstIndex = arr.indexOf(a.toString());
    var secondIndex = arr.indexOf(b.toString());


    // Change the position of both elements
    arr[firstIndex] = b;
    arr[secondIndex] = a;


    // Return swapped string
    return arr.join(' ');
}


alert(switchNumbers(2, 28));

DEMO

【讨论】:

    【解决方案2】:

    也可以试试:

    var numbers = "2 4 13 14 28 33";
    
    function switchNum(from, to){
      return numbers.replace(/\d+/g, function(num){
        return num == from ? to : num == to ? from :  num
      })
    }
    
    alert(switchNum(2, 28)) //result: "28 4 13 14 2 33"

    注意:不要使用switch作为函数名,switch是JavaScript的声明。

    【讨论】:

    • @skobaljic “酷”并不意味着“最高效” ;-)
    • 这100%回答了这个问题,这是在字符串中切换唯一数字的最佳方式。谢谢大佬!
    【解决方案3】:

    我无法判断这是否无聊,但至少它不是分裂和循环:)

    function switchNumbers(str, x, y) {
      var regexp = new RegExp('\\b(' + x + '|' + y + ')\\b', 'g'); // /\b(x|y)\b/g
      return str.replace(regexp, function(match) { return match == x ? y : x; });
    }
    
    var s = "2 4 13 14 28 33";
    
    document.write('<pre>' + switchNumbers(s, 2, 28) + '</pre>');

    【讨论】:

      【解决方案4】:

      我确定这不是最好的方法..但它有效..

      var swapnums = function(x,first,second) {
          var y = x.split(" ");
          var locOfFirst = y.indexOf(first.toString());
          var locOfSecond = y.indexOf(second.toString());
          y[locOfFirst] = second.toString();
          y[locOfSecond] = first.toString();
          return y.join(" ");
      };
      

      【讨论】:

        【解决方案5】:
        var str = "2 4 13 14 28 33";
        switchNumbers(2,28);  // call
        function switchNumbers(a,b)
        {
        
        
        var split_ = str.split(" ");
        
        var index_of_1 = split_.indexOf(a+"");
        var index_of_2 =  split_.indexOf(b+"")
        
        temp =  split_[index_of_1];
        split_[index_of_1] = split_[index_of_2] ;
        split_[index_of_2] = temp ;
        
        
        split_.toString(" "); // Answer
        }
        

        【讨论】:

        • 不管你有没有自己的小提琴,发布相同的答案是没有意义的。
        【解决方案6】:

        类似的东西应该可以工作。

        var str= "2 4 13 14 28 33";
        function switchNumbers(a, b) {
            var arr = str.split(" ");
            var first= arr.indexOf(a), second = arr.indexOf(b);
            arr[first] = arr.splice(second, 1, arr[first])[0];
            return arr.join(" ");
        }
        

        Jsfiddle demo

        【讨论】:

          【解决方案7】:

          我认为您最好的解决方案可能是对字符串使用 JavaScript 的本机替换方法。

          W3Schools 有一个很好的低调here。它应该完全符合您的要求,但可能会替换您指定的所有数字,因此请务必说类似var replacement = str.replace("2 ", "28 ");

          编辑:指出了一个很好的缺陷。相反,您可以尝试:

          EDIT2:Opps,原始代码有一些缺陷。经过测试,工作正常! :)

              function replaceNumbers(x1, x2, str) {
                  var strMod = " " + str + " "
                  var x1Mod = " " + x1 + " "
                  var x2Mod = " " + x2 + " "
                  
                  // Want to replace "farthest" first to ensure correct replacement.
                  if (str.indexOf(x1Mod) > str.indexOf(x2Mod)) {
                      strMod = strMod.replace(x1Mod, x2Mod)
                      strMod = strMod.replace(x2Mod, x1Mod)
                  } else {
                      strMod = strMod.replace(x2Mod, x1Mod)
                      strMod = strMod.replace(x1Mod, x2Mod)
                  }
                  
                  return strMod.slice(1, strMod.length - 1)
              }
          
             var numbers = "2 4 13 14 28 33";
             alert(replaceNumbers(2, 33, numbers))

          【讨论】:

          • 猜测必须先用空格包裹字符串,而不是使用“2”和“28”(因为 28 可以在末尾,而不是“2”也可以从“12”匹配?
          • 刚刚测试并修复!忘记做其他两个替换并且忘记切片结束是不包含的。我在您的警报中添加了一个代码 sn-p。 :)
          猜你喜欢
          • 1970-01-01
          • 2015-08-18
          • 1970-01-01
          • 2018-06-04
          • 2016-01-28
          • 2021-03-02
          • 1970-01-01
          • 2016-05-10
          相关资源
          最近更新 更多