2016-07-28 4 views
-5

У меня есть массив, который включает в себя некоторые функции, и это выглядит следующим образом:Запуск функции случайным образом

var all_questions = [ 
    show_question(1, 1), 
    show_question(2, 1), 
    show_question(3, 1), 
]; 

Я хотел бы выполнить те функции, в этот массив случайным образом. Как я могу это сделать?

+7

Все функции будут выполняться в то время, когда массив становится создан –

+0

Почему вы хотите это сделать? – Liam

+0

Чтобы продлить комментарий @ RajaprabhuAravindasamy - скобка в конце имени функции - это то, что на самом деле «вызывает» функцию. – Lix

ответ

6

Во-первых, вам необходимо обернуть эти функции анонимными функциями, иначе они будут вызваны немедленно. Оттуда вы можете get a random element from the array и назвать его, например:

var all_questions = [ 
 
    function() { show_question(1, 1) }, 
 
    function() { show_question(2, 1) }, 
 
    function() { show_question(3, 1) }, 
 
]; 
 

 
all_questions[Math.floor(Math.random() * all_questions.length)](); 
 

 
function show_question(a, b) { 
 
    console.log(a, b); 
 
}

Обратите внимание, что вы могли бы улучшить логику, просто рандомизации первый параметр функции только, вместо того, чтобы хранить ссылки на функции в массив:

function show_question(a, b) { 
 
    console.log(a, b); 
 
} 
 

 
var rnd = Math.floor(Math.random() * 3) + 1; 
 
show_question(rnd, 1);

+0

почему -1? – Liam

+0

Невозможно понять downvotes ... – Luca

+0

Компенсация затем – VisioN

0

что-то вроде

var all_questions = [ 
    function() show_question(1, 1), 
    function() show_question(2, 1), 
    function() show_question(3, 1), 
]; 
var x = Math.floor((Math.random() * 3) + 1); 
// do something you want 
    all_questions[x]; 
+0

Как и в исходном вопросе, функции будут вызываться, пока вы определяете массив. – Lix

+0

@liam - вы заметили, что вы удалили часть образца кода, который был предоставлен? – Lix

+0

hmm, не предназначенный @lix. Отредактировано для того, чтобы делать то, что я на самом деле хотел сделать, приложения – Liam

2

Если вы вызываете ту же функцию с различными аргументами, я бы сказал, что это лучший вариант, чтобы выбрать аргументы случайным образом вместо функции.

var args = [ 
    [1,2], 
    [1,3], 
    [1,4], 
    ... 
] 

// Get a random element from the array 
// http://stackoverflow.com/a/4550514/558021 
var randomArgs = args[ Math.floor(Math.random()*args.length) ]; 

show_question.apply(this, randomArgs); 

The apply function здесь используется, потому что, как она проходит аргументы в целевой функции. Когда вы используете apply для выполнения функции, аргументы, которые вы хотите передать функции, предоставляются в массиве и затем разделяются на отдельные аргументы при передаче целевой функции.

+2

Вы можете использовать 'show_question.apply (randomArgs)', и OP не нужно было бы изменять функцию в все. –

+0

Я подумал об этом, но в конце концов выбрал этот подход, так как я чувствовал, что он будет лучше соответствовать уровню компетенции этого вопроса. – Lix

+1

Я могу понять, что, хотя ИМО лучше привлечь кого-то до вашего уровня вместо того, чтобы обслуживать их. –

0

Вы можете сделать это следующим образом;

var allQuestions = [ 
        showQuestion.bind(this, 1, 1), 
        showQuestion.bind(this, 2, 1), 
        showQuestion.bind(this, 3, 1), 
        ], 
displayQuestion = allQuestions[~~(Math.random()*allQuestions.length)]; 
Смежные вопросы