簡體   English   中英

Array.length有時不重新檢查數組長度

[英]Array.length occasionally does not recheck the array length

我在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)沒有分配為變量,而是直接放置在splice方法中時,這似乎從未發生過,如以下示例代碼所示:

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(或Apps腳本)只會檢查一次數組長度,而不會再檢查一次,但是事實證明它大部分有效,而且有時會中斷(或在不同位置中斷)。 這是Javascript還是Apps腳本的怪癖? 是什么原因造成的? 是否可能存在某種競爭條件,即在前一個splice方法完成更新數組之前檢查數組長度? 如果未將其分配為變量,為什么這似乎沒有發生?

我對這里的任何想法或評論最感興趣。

現在,對於每個splice ()調用, randomNum都是相同的,因為在開始時只設置了一次。 正如@Andreas所建議的,如果開頭是3 ,那么它將只刪除一次元素。 實際上,只有將其輸出為0時,您才會獲得所需的輸出。嘗試使randomNum為函數:

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

暫無
暫無

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

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