2016-12-02 28 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的数组长度为正循环? –