2013-07-05 5 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 существует несколько способов обработки этого. ОП может решить, что лучше. Он попросил случайный способ выбрать что-то, а не 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…]), затем случайным образом сплайсируйте одно значение за раз и используйте его как индекс для извлечения значения из массива. Оба подхода не будут иметь бесконечный цикл и будут посещать каждый элемент максимум один раз.