2013-07-05 79 views
2

我有一個多維數組。我需要一些循環來隨機選取數組中的字符串,並檢查該字符串是否包含字符。如果沒有,則重複直到找到一個。ARRAY javascript indexOf

我寫了一個for循環,檢查數組中的字符串,但它從0開始,並在數組中查找,直到找到它。我需要它隨機在數組中選擇一個字符串...有幫助嗎?

的jsfiddle - >http://jsfiddle.net/hz2MZ/1/

jQuery的

$(document).ready(function() { 
var myarr = [{"Name":"Bob", "Char":"134"}, 
      {"Name":"Phil", "Char":"134"}, 
      {"Name":"Jane", "Char":"1"}, 
      {"Name":"Don", "Char":"4"}, 
      {"Name":"Dan", "Char":"2"}, 
      {"Name":"Jan", "Char":"12"}, 
      {"Name":"Bill", "Char":"24"}, 
      {"Name":"Sam", "Char":"14"}, 
      {"Name":"Jake", "Char":"23"}, 
      {"Name":"Ben", "Char":"3"}]; 


$('button').click(function() { 
    for(var i = 0; i < myarr.length; i++) { 
     if(myarr[i].Char.indexOf('2') !== -1) { 
      alert("Name: " + myarr[i].Name + "\nChar: " + myarr[i].Char); 
     return; 
     } else {} 
    } 
}); 

}); 
+2

[先將數組隨機播放](http://stackoverflow.com/q/2450954/218196),然後遍歷它。 –

+2

*「我有一個多維數組。」*不,你沒有。你有一個對象數組。 –

+1

'else {}'?爲什麼? – nnnnnn

回答

3

我的解決方案

$('button').click(function() { 
     var found = false; 

     while (!found) { 
      var randomIndex = Math.floor(Math.random() * myarr.length); 
      if (myarr[randomIndex].Char.indexOf('2') !== -1) { 
       alert("Name: " + myarr[randomIndex].Name + "\nChar: " + myarr[randomIndex].Char); 
       found = true; 
      } else {} 

     } 
    }); 

編輯

更新無限循環問題

$('button').click(function() { 
    var found = false; 
    var maxRandom = 20; 
    var currentRandom = 0; 

    while (!found && currentRandom < maxRandom) { 
     var randomIndex = Math.floor((Math.random() * myarr.length)); 
     currentRandom++; 

     if (myarr[randomIndex].Char.indexOf('2') !== -1) { 
      alert("Name: " + myarr[randomIndex].Name + "\nChar: " + myarr[randomIndex].Char); 
      found = true; 
     } else {} 
    } 
} 
+2

請注意,如果搜索到的字符不在任何數組項中,這將是無限循環。 – nnnnnn

+0

*「我看到TJ也打敗了我吧」*不,你抓住了我錯過的必要位,+1。儘管我會刪除完全沒有意義的「else {}」。 :-) –

+0

@nnnnnn有多種處理方式。 OP可以決定哪一個最好。他要求隨機選擇一些東西,而不是100%防彈解決方案。這是朝着正確方向邁出的一步。 – Johan

1

一種方法是在陣列複製,然後隨機從複製一個拼接件和檢查所需的值:

function randomValueByChar(arr, c) { 
    var a = arr.slice && arr.slice(); 
    var i = a.length || 0; 
    var t; 

    while (i--) { 
    t = a.splice(Math.random() * i | 0, 1); 
    if (t[0].Char.indexOf(c) != -1) return t; 
    } 
} 

另一種方法是創建索引的陣列(例如[0,1,2,3…]),然後隨機拼接一個值並將其用作索引以從數組中檢索值。兩種方法都不會有無限循環,最多隻能訪問一次成員。