2013-07-05 48 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…]),然后随机拼接一个值并将其用作索引以从数组中检索值。两种方法都不会有无限循环,最多只能访问一次成员。