我在Google脚本中有一个相对简单的功能,偶尔会出现我的预期。
我有一个字符串数组和一个随机数生成器。生成随机数时,它将数组值作为随机数的索引,将其拼接出来并返回。这确保了我只从阵列中获得唯一值。代码如下:
function testFunction() {
var array = [
"Test String 1", "Test String 2", "Test String 3", "Test string 4"
];
var randomNum = generateRandomNumber(array.length - 1,0);
Logger.log(array.length);
var arrayStringOne = array.splice(randomNum, 1);
Logger.log(array.length);
var arrayStringTwo = array.splice(randomNum, 1);
Logger.log(array.length);
var arrayStringThree = array.splice(randomNum, 1);
Logger.log(array.length);
return [arrayStringOne,arrayStringTwo,arrayStringThree];
}
function generateRandomNumber(maximum, minimum){
var randomNumber = Math.round(Math.random() * (maximum - minimum) + minimum);
return randomNumber;
}
虽然我通常会看到阵列长度被正确扣除(例如,当运行时阵列从4到3变为2到1),偶尔它会在中途停止缩短,我不知道为什么(所以我将看到数组长度为4,3,3,3而不是4,3,2,1)。
这是我日志的屏幕截图:
与它应该做什么:
有趣的是,它并不总是在同一个地方打破。有时它会进一步向下突破,我会看到一个像4,3,2,2这样的数组长度返回:
此外,当generateRandomNumber(array.length - 1,0)
未被指定为变量,而是直接放入拼接方法时,这似乎不会发生,如下例所示:
function testFunction() {
var array = [
"Test String 1", "Test String 2", "Test String 3", "Test string 4"
];
Logger.log(array.length);
var arrayStringOne = array.splice(generateRandomNumber(array.length - 1,0), 1);
Logger.log(array.length);
var arrayStringTwo = array.splice(generateRandomNumber(array.length - 1,0), 1);
Logger.log(array.length);
var arrayStringThree = array.splice(generateRandomNumber(array.length - 1,0), 1);
Logger.log(array.length);
return [arrayStringOne,arrayStringTwo,arrayStringThree];
}
function generateRandomNumber(maximum, minimum) {
var randomNumber = Math.round(Math.random() * (maximum - minimum) + minimum);
return randomNumber;
}
这对我来说是一个非必要的脚本,而且这个"解决方法"是一个很好的替代品,但我很好奇为什么会这样。最初我想象一下,一旦我分配了变量:
var randomNum = generateRandomNumber(array.length - 1,0);
Javascript(或者应用程序脚本)只会检查一次数组长度,而不会再次检查,但事实上它主要工作且有时会中断(或者在不同的地方中断)这让我很难过。这是Javascript或Apps脚本的怪癖吗?是什么造成的?是否有可能存在某种竞争条件,在前一个splice
方法更新数组之前检查数组长度?为什么当它没有被指定为变量时似乎不会发生?
我对这里的任何想法或评论最感兴趣。
答案 0 :(得分:1)
现在randomNum
对于每个splice ()
调用都是相同的,因为它只在开头设置一次。正如@Andreas建议的那样,如果它在开始时是3
,那么它只会删除一次元素。事实上,如果它是0,你只会得到你想要的输出。试着让randomNum
成为一个函数:
var randomNum = function () {
return generateRandomNumber(array.length - 1,0);
}