2015-06-20 66 views
1

我在Google腳本中有一個相對簡單的函數,它偶爾不會像我期望的那樣工作。Array.length偶爾不會重新檢查數組長度

我有一個字符串和一個隨機數發生器的數組。當生成一個隨機數時,它將該數組的值作爲隨機數的索引,將其拼接並返回。這確保我只能從數組中獲得唯一的值。的代碼如下:

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)。

這裏是我的日誌截圖它這樣做時:

enter image description here

對戰它應該做的:

enter image description here

有趣的是,它也不會總是在打破一樣的地方。有時它會進一步分解線,我將看到4,3,2,2陣列長度返回:

enter image description here

此外,當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或應用腳本的怪癖嗎?這是什麼造成的?有沒有可能在這裏存在某種競爭條件,在之前的splice方法完成更新數組之前,數組長度正在被檢查?爲什麼當它沒有被指定爲變量時,這似乎不會發生?

我最感興趣的任何想法或評論在這裏。

+4

讓'randomNum'是'3 // ==(array.length - 1)'所以你會用第一個'.splice()'去掉最後一個元素。在下一個'.splice()''randomNum'仍然是'3',但'array'現在只有3個元素。因此'.splice()'不會從數組中移除一個元素。 – Andreas

回答

1

現在randomNum與每個splice()呼叫相同,因爲它只在開始時設置一次。正如@安德里亞斯所說的,如果它在開始時是3,那麼它只會刪除一個元素。事實上你永遠只能得到你想要的輸出,如果是0試着做randomNum功能:

var randomNum = function() { 
    return generateRandomNumber(array.length - 1,0); 
} 
+0

嗯,這正如我原先的問題中提到的那樣。我猜是什麼讓我感到有些時候有效,而不是其他情況。我從來沒有認爲這是由於隨機數發生器只是有時會拋出一個比數組大的值, – HDCerberus

+2

@HDCerberus隨機數發生器不是問題的根源。這是因爲你爲'.splice()'多次使用相同的數字 – Andreas