2016-12-02 58 views
2

從陣列移動到B陣列沒有undefined

我的問題是以下內容。我有兩個數組,我想將一個元素從數組A移動到數組B.但是它並不那麼容易。哪個元素將完全是隨機的。我複製我的代碼,所以我的目標會更容易理解:

var array1 = ["A","B","C"]; 
var array2 = []; 
var move = function() { 
var x = Math.floor((Math.random() * 100) + 1); 
if (x > 0 && x < 33.1 && array1[0] !== "undefined") 
     {array2.push(array1[0]) 
     delete array1[0] 
     } 
    if (x > 33.2 && x < 66.1 && array1[1] !== "undefined") 
     {array2.push(array1[1]) 
     delete array1[1] 
     } 
    if (x > 66.2 && x < 100.1 && array1[2] !== "undefined") 
     {array2.push(array1[2]) 
     delete array1[2] 
     } 
    else { 
    move(); 
    return 
    } 
} 
move(); 
move(); 
move(); 
console.log(array1); 
console.log(array2); 

所以其目的是,函數調用的3倍,我們將在B陣列中的三個要素。如果隨機數是「未定義的」,我希望我的函數自動重啓。所以對於下一個隨機卷,它會選擇另一個元素。等等等等。 我的想法中的代碼,但它不工作,因爲它仍有下探「不確定」的。 謝謝,

+0

ARRAY1 [2]!==「undefined」你比較的不是undefined,而是一個字符串的文本是'undefined';) 你想要的是array1 [2]!== undefined – grzesiekgs

+0

你應該使用'typeof array1 [2]!= =「undefined」' – VDarricau

+1

第二件事。我不知道你說的是什麼意思: '如果隨機數是「未定義」,我希望我的函數自動重啓' Math.random將始終返回0和1之間的數字 – grzesiekgs

回答

0

當您測試,例如,array1[1] !== "undefined"您不測試如果該變量未定義,但如果該變量等於一個字符串的值爲"undefined"

因此,你可以通過undefined,例如更換"undefined"更換

yourVar !== "undefined" 

通過

yourVar !== undefined 

即使我不推薦通過任何手段來做到這一點,因爲它的工作只是只要有人不創建一個名爲未定義的變量。此外,由於要測試你的變量的存在,其他的說,正確的方法做你的測試是通過做

typeof yourVar !== 'undefined' 

有關詳細信息,請參閱How to check a not-defined variable in JavaScript

UPDATE 然後爲了防止你的函數進入無限循環,你應該檢查你的數組是否只包含空元素。

首先你應該確定哪些可以檢查此功能,如下

Array.prototype.isNull = function(){ 
    return this.join().replace(/,/g,'').length === 0; 
}; 

然後,你應該通過array1非無效條件move()遞歸調用。通過由

else {if (!array1.isNull()){move()};return} 
+0

嗨, 我喜歡你的解釋,很簡單,容易掌握。但是,我不斷收到相同的錯誤消息: VM113:4 Uncaught RangeError:超出最大調用堆棧大小 – Koppany

+0

@Koppany。看起來你的函數可能會在第二次調用move函數時進入無限循環。這會導致「超出最大調用堆棧大小」。實際上,當第二次調用move函數時,array1很可能由空值組成。您必須按照我更新的答案中所示條件遞歸調用。 – Kanak

0

你的狀態陣列1更換

else {move();return} 

[X] == 「未定義」 是錯誤的。它會檢查數組1 [X]爲字符串「undefined」

你需要使用像

typeof(array1[x]) !== 'undefined' 
1

爲什麼不使用Array#splice,對於反映的array1長度的隨機值。

var array1 = ["A", "B", "C"], 
 
    array2 = [], 
 
    move = function() { 
 
     var x = Math.floor((Math.random() * array1.length)); 
 
     array2.push(array1.splice(x, 1)[0]); 
 
    }; 
 

 
move(); 
 
move(); 
 
move(); 
 
console.log(array1); 
 
console.log(array2);

+0

是的。拼接工作的方式,如果第二個參數不相等0.結果是一個數組,我只使用一個項目,我拼接。 –

+1

謝謝。困惑的拼接和切片。 –

+0

我想知道這是否會更好(更清晰?肯定會更一般化)如果您在for循環中放置單個移動命令,並且可能會將三個常量或變量設置爲三個或原始數組的長度(之前循環)。或者甚至陣列1的數組長度爲正循環? –