通过引用传递问题对JQuery中重用PHP代码进行置换

Permutations reusing PHP code in JQuery with passing by reference issue

本文关键字:代码 PHP 引用 问题 JQuery      更新时间:2023-09-26

原始代码:

// function to generate and print all N! permutations of $str. (N = strlen($str)).
function permute($str,$i,$n) {
   if ($i == $n)
       print "$str'n";
   else {
        for ($j = $i; $j < $n; $j++) {
          swap($str,$i,$j);
          permute($str, $i+1, $n);
          swap($str,$i,$j); // backtrack.
       }
   }
}
// function to swap the char at pos $i and $j of $str.
function swap(&$str,$i,$j) {
    $temp = $str[$i];
    $str[$i] = $str[$j];
    $str[$j] = $temp;
}   
$str = "hey";
permute($str,0,strlen($str)); // call the function.

我想为我的jquery重用这个带有排列的代码,所以这里是我的代码:

div id="wrapper">
    <input type="text" id="word">
</div>
<div id="combinations">
    <p>
    </p>
</div>
<script>
    function permute(str,i,n) {
           if (i == n)
                $('p').append(str+" ");
           else {
                for (j = i; j < n; j++) {
                  swap(str,i,j);
                  permute(str, i+1, n);
                  swap(str,i,j); // backtrack.
               }
           }
        }
        // function to swap the char at pos $i and $j of $str.
    function swap(str,i,j) {
        var temp = str[i];
        str[i] = str[j];
        str[j] = temp;
    }   
    $('#word').on('input',function(e){
        var str = $("#word").val();
        if(str == ''){
            $('p').empty();
        }
        if(str.length != strOld){
            $('p').empty();
        }
        var strOld = str.length;
        permute(str, 0,str.length)

    });
</script>

所以在那一段中,我想显示用户输入的所有排列,所以如果用户输入AB,它将显示AB BA等等,我真的不确定我该如何改变&str从原来的一个到JQuery我读过其他一些关于在JS/JQuery中通过引用传递的堆栈问题,我真的无法理解

现在,这段代码并没有产生任何错误,它只是显示用户输入的输入字段的确切副本。

更新:我尝试了你的建议:

function permute(str,i,n) {
           if (i == n)
                $('p').append(str+" ");
           else {
                for (j = i; j < n; j++) {
                  str = swap(str,i,j);
                  permute(str, i+1, n);
                  str = swap(str,i,j); // backtrack.
               }
           }
        }
    function swap(str,i,j) {
        str = str.split("");
        var temp = str[i];
        str[i] = str[j];
        str[j] = temp;
        return str.join("");
    }   

        var str = "hey";
        permute(str, 0,str.length)

它只显示了嘿,没有其他

这是PHP代码的JS版本:

function permute( str, i, n ) {
   if ( i == n ){
      console.log(str);     
   } else {
        for ( var j = i; j < n; j++) {
          str = swap( str, i, j );
          permute( str, i+1, n );
          str = swap( str, i, j ); // backtrack.
       }
   }
}
// function to swap the char at pos $i and $j of $str.
function swap( str, i, j ) {
    str = str.split("");
    var temp = str[i];
    str[i] = str[j];
    str[j] = temp;
    return str.join("");
}   
var str = "hey";
permute( str, 0, str.length ); // call the function.

这是JSFiddle

JavaScript不知道函数的参数。有些人说是这样,因为对象是通过引用传递的,但事实并非如此。对象是引用类型,这意味着对象变量本身就是(对对象数据的)引用,但您仍然通过值传递变量本身,因此无法更改它。

但在这种情况下,它甚至与对象无关,而是与字符串有关。

我认为最简单的解决方案是返回新字符串:

  function swap(str,i,j) {
    var temp = str[i];
    str[i] = str[j];
    str[j] = temp;
    return str;
  }   

然后这样称呼它:

  str = swap(str,i,j);