簡體   English   中英

使用Javascript搜索數組中的項目

[英]Search for item in array with Javascript

我試圖在用戶單擊按鈕的地方添加一些代碼,該代碼生成3個數字(沒有重復,因此245可以,但122和121則不可以)並在屏幕上每秒顯示一次。 為了確保沒有重復,我使用了一個數組: var usedNums = []; 然后,我創建一個數字( digit = Math.random() ),並檢查它是否已經在數組中,如果不是,則添加它,如下所示:

if ($.inArray(digit, usedNums) !== -1) {
        newNums();
    } else {
        usedNums.push(digit);
        $('#memDigit').html(digit);

}

最初的幾次,它都有效,但是當我第十次單擊它時,我收到了Uncaught RangeError: Maximum call stack size exceeded錯誤。 救命!

這是完整的代碼:

var usedNums = [];
var digit;
var amount = 3;

function newNums() {
    digit = Math.floor(Math.random() * 10);
    if ($.inArray(digit, usedNums) !== -1) {
        newNums();
    } else {
        usedNums.push(digit);
        $('#memDigit').html(digit);

    }

}

function createNums() {
    for (var i; i < amount; i++) {
        setTimeout(newNums, 1000);
    }
}

//$(document).ready(createNums);

我認為您應該在每個數字生成完成后清空/重新初始化usedNums數組。

如果IE <= 10 crypto.getRandomValues ,則您可能希望利用crypto.getRandomValues完成此操作。

getRandomValues方法使用在該數組類型支持的范圍內的一系列隨機值填充TypedArray 如果我們要求這些值中的10個,則實際上實際上是一個數字0-9(即數組的索引)的散列,該散列預先與隨機值相關聯以用於按(值)排序。 結果將更加隨機,並且-與“已經看到此值,請重試”模式不同-它應在恆定時間內運行。

ES6:

const nums = [ ...crypto.getRandomValues(new Int16Array(10)) ]
  .map((sortVal, num) => [ sortVal, num ])
  .sort(([ a ], [ b ]) => a < b ? -1 : Number(a > b))
  .map(([ , num ]) => num)
  .slice(0, 3);

ES5:

var nums = [].slice.call(crypto.getRandomValues(new Int16Array(10)))
  .map(function(sortVal, num) { return [ sortVal, num ]; })
  .sort(function(a, b) { return a[0] < b[0] ? -1 : Number(a[0] > b[0]); })
  .map(function(pair) { return pair[1]; })
  .slice(0, 3);

分解:

  • new Int16Array(10)創建一個長度為10的空TypedArray
  • crypto.getRandomValues(...)使用隨機值填充該數組
  • 我們將結果轉換為常規數組
  • 我們將其映射到[randomVal,index]元組
  • 我們通過隨機值對其進行排序(記住明確強制轉換為Number,以涵蓋Safari sort實現錯誤)
  • 我們只映射到索引,即0-9之間的數字
  • 我們只獲取前三個值

暫無
暫無

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

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