簡體   English   中英

當在Javascript中使用許多for循環時,輸出未定義

[英]When many for loops are used in Javascript, output is undefined

https://jsfiddle.net/LBMF_1/gacLzLnn/所示,我的代碼表面上使用for循環中的for循環,表面上生成了8位數字的所有可能排列。( 問題末尾 )我的代碼似乎是正確的語法,因為JSHint和in-chrome控制台都沒有錯誤。 這是我的錯誤,還是由JS引起的常見問題? 可能應該是前者,因為這似乎應該起作用獎勵積分:可以使用其他什么方法來避免嵌套的for循環? 您不知道我有多感謝您的幫助。 此外,Stack Overflow和新段落的內容如何? 代碼在這里,在我看來,運行時應該在控制台中粘貼一長串數字,但會出現許多“未定義”的數字。

var generator = function() {
  listofavailable = listofavailablereset;
  fullarray = [];


  for (i = 7; i > 0; i--) {
    numgen = "";
    inum = listofavailable[i];
    listofavailable.splice(i, 1);
    numgen = inum;
    for (v = 6; v > 0; v--) {
      vnum = listofavailable[v];
      listofavailable.splice(v, 1);
      numgen = numgen.concat(vnum);
      console.log(numgen);
      for (c = 5; c > 0; c--) {
        cnum = listofavailable[c];
        listofavailable.splice(c, 1);
        numgen = numgen.concat(cnum);
        for (g = 4; g > 0; g--) {
          gnum = listofavailable[g];
          listofavailable.splice(g, 1);
          numgen = numgen.concat(gnum);
          for (k = 3; k > 0; k--) {
            knum = listofavailable[k];
            listofavailable.splice(k, 1);
            numgen = numgen.concat(knum);
            for (b = 2; b > 0; b--) {
              bnum = listofavailable[b];
              listofavailable.splice(b, 1);
              numgen = numgen.concat(bnum);
              for (j = 1; j > 0; j--) {
                jnum = listofavailable[j];
                listofavailable.splice(j, 1);
                numgen = numgen.concat(jnum);
                fullarray = fullarray + numgen;
              }
            }
          }
        }
      }
    }
  }

};

這是根據您的小提琴修改的實現。 請注意,您的示例中缺少數字“ 0”和“ 5”,我不確定是否打算這樣做。

var listofavailable = ['1', '2', '3', '4', '6', '7', '8', '9'];
var fullarray;

var generator = function() {
  fullarray = [];
  var numgen;
  // first digit
  for (var a = 7; a >= 0; a--) {
    var anum = listofavailable[a];
    listofavailable.splice(a, 1);
    numgen = anum;
    // second digit
    for (var i = 6; i >= 0; i--) {
      var inum = listofavailable[i];
      listofavailable.splice(i, 1);
      numgen = numgen.concat(inum);
      // third digit
      for (var v = 5; v >= 0; v--) {
        var vnum = listofavailable[v];
        listofavailable.splice(v, 1);
        numgen = numgen.concat(vnum);
        // fourth digit
        for (var c = 4; c >= 0; c--) {
          var cnum = listofavailable[c];
          listofavailable.splice(c, 1);
          numgen = numgen.concat(cnum);
          // fifth digit
          for (var g = 3; g >= 0; g--) {
            var gnum = listofavailable[g];
            listofavailable.splice(g, 1);
            numgen = numgen.concat(gnum);
            // sixth digit
            for (var k = 2; k >= 0; k--) {
              var knum = listofavailable[k];
              listofavailable.splice(k, 1);
              numgen = numgen.concat(knum);
              // seventh digit
              for (var b = 1; b >= 0; b--) {
                var bnum = listofavailable[b];
                listofavailable.splice(b, 1);
                numgen = numgen.concat(bnum);

                // eighth digit
                //add whatever else is left in listofavailable[0] to the string
                var jnum = listofavailable[0];
                numgen = numgen.concat(jnum);

                fullarray.push(numgen);
                //console.log(numgen);

                //revert list removals
                listofavailable.push(numgen.substr(numgen.length - 2,1));

                //revert additions to the string
                numgen = numgen.substr(0,numgen.length-2);
              }// b loop
              listofavailable.push(numgen.substr(numgen.length - 1));
              numgen = numgen.substr(0,numgen.length-1);
            }// k loop
            listofavailable.push(numgen.substr(numgen.length - 1));
            numgen = numgen.substr(0,numgen.length-1);
          }// g loop
          listofavailable.push(numgen.substr(numgen.length - 1));
          numgen = numgen.substr(0,numgen.length-1);
        }// c loop
        listofavailable.push(numgen.substr(numgen.length - 1));
        numgen = numgen.substr(0,numgen.length-1);
      }// v loop
      listofavailable.push(numgen.substr(numgen.length - 1));
      numgen = numgen.substr(0,numgen.length-1);
    } // i loop
    listofavailable.push(numgen.substr(numgen));
    numgen = "";
  } // a loop
};
generator();

console.log(fullarray.length);
console.log(fullarray);

解釋原始代碼出了什么問題。

您在b循環的第二次迭代中得到的是未定義的

              bnum = listofavailable[b];

這是因為您的函數在每次拼接一個值時都會清空7個可用值的數組,將listofavailable為單個元素數組, listofavailable[0] = "1" 但是,當b第二次迭代時,它將嘗試獲取不存在的元素listofavailable[1] ,因此bnum = undefined 當嘗試將undefined值連接到numgen這將使numgen = undefined並隨后破壞所有內容。

此外,您嘗試添加到數組的方式

fullarray = fullarray + numgen;

不會執行您的預期,實際上是在尋找Array.prototype.push()函數,因此

fullarray.push(numgen);

並為listofavailable使用重置值是個好主意,但是您實現它的方式也無法

listofavailable = listofavailablereset;

不會將數組元素從listofavailablereset復制到listofavailable而是使listofavailable引用同一數組對象,因此,當您修改一個數組對象時,會影響另一個數組對象。 相反,您可以僅使用slice()復制數組。

listofavailable = listofavailablereset.slice();

請注意, slice()僅創建一個淺表副本,每個數組中的對象引用都將指向同一對象。

請查看Mozilla Javascript參考頁面,以獲得出色的JavaScript參考文檔。

通過生成這些排列,您所做的工作與枚舉所有8位以8為底的數字是同構的,因此只需執行以下操作:

var digits = ['1', '2', '3', '4', '6', '7', '8', '9'];
var n, d, permutations = [], entry;

for (var i = 0, limit = parseInt("100000000", 8); i < limit; ++i) {
  entry = "";
  for (d = 0, n = i; d < digits.length; ++d) {
    entry = digits[n % 8] + entry;
    n = Math.floor(n / 8);
  }
  permutations.push(entry);
}
console.log(permutations);

請注意,這將花費長時間。 您的瀏覽器(如果您正在瀏覽器中進行操作)將抱怨腳本繁忙。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM