Положение
В настоящее время я пишу виджет JavaScript, который отображает случайные кавычки в элемент HTML. цитаты хранятся в массиве javascript, а также сколько раз они отображались в элементе html. Отображаемая цитата не может быть той же самой цитатой, которая была ранее отображена. Кроме того, вероятность выбора цитаты основана на ее предыдущих вхождениях в элементе html. (меньшее количество случаев должно привести к более высокой вероятности по сравнению с другими цитатами, которые будут выбраны для отображения.
Текущее решение
В настоящее время я заставил это работать (с моими крайними недостатками в знании javascript), используя множество циклических циклов по различным массивам. хотя в настоящее время это работает (!!), я считаю, что это решение довольно дорого для того, чего я хочу достичь.
Что я ищу
- Альтернативные методы удаления элемента массива из массива , в настоящее время цикл по всему массиву для поиска элемента, который я хочу удалить, и копирование всех других элементов в новый массив
- Альтернативный метод вычисления и выбора элемента из массива по его появлению
- Все остальное, что вы заметили, я должен / мог бы сделать по-другому, все еще применяя установленные бизнес-правила согласно Ситуация
Код
var quoteElement = $("div#Quotes > q"),
quotes = [[" AAAAAAAAAAAA ", 1],
[" BBBBBBBBBBBB ", 1],
[" CCCCCCCCCCCC ", 1],
[" DDDDDDDDDDDD ", 1]],
fadeTimer = 600,
displayNewQuote = function () {
var currentQuote = quoteElement.text();
var eligibleQuotes = new Array();
var exclusionFound = false;
for (var i = 0; i < quotes.length; i++) {
var iteratedQuote = quotes[i];
if (exclusionFound === false) {
if (currentQuote == iteratedQuote[0].toString())
exclusionFound = true;
else
eligibleQuotes.push(iteratedQuote);
} else
eligibleQuotes.push(iteratedQuote);
}
eligibleQuotes.sort( function (current, next) {
return current[1] - next[1];
} );
var calculatePoint = eligibleQuotes[0][1];
var occurenceRelation = new Array();
var relationSum = 0;
for (var i = 0; i < eligibleQuotes.length; i++) {
if (i == 0)
occurenceRelation[i] = 1 / ((calculatePoint / calculatePoint) + (calculatePoint / eligibleQuotes[i+1][1]));
else
occurenceRelation[i] = occurenceRelation[0] * (calculatePoint / eligibleQuotes[i][1]);
relationSum = relationSum + (occurenceRelation[i] * 100);
}
var generatedNumber = Math.floor(relationSum * Math.random());
var newQuote;
for (var i = 0; i < occurenceRelation.length; i++) {
if (occurenceRelation[i] <= generatedNumber) {
newQuote = eligibleQuotes[i][0].toString();
i = occurenceRelation.length;
}
}
for (var i = 0; i < quotes.length; i++) {
var iteratedQuote = quotes[i][0].toString();
if (iteratedQuote == newQuote) {
quotes[i][1]++;
i = quotes.length;
}
}
quoteElement.stop(true, true)
.fadeOut(fadeTimer);
setTimeout( function () {
quoteElement.html(newQuote)
.fadeIn(fadeTimer);
}, fadeTimer);
}
if (quotes.length > 1)
setInterval(displayNewQuote, 10000);
Рассмотрены альтернативы
Всегда выбирал элемент массива с наименьшим вхождением.
Принято решение об этом, поскольку это может / могло бы выявить слишком очевидную закономерность в анимации
объединить несколько циклов для уменьшения рабочей нагрузки
Принято решение об этом, так как это сделало бы код эзотерическим, я, вероятно, больше не пойму код на следующей неделе
jsFiddle reference
http://jsfiddle.net/P5rk3/
Обновление
Переписал мою функцию с помощью упомянутых методов, хотя я боюсь, что эти методы все еще перебирают весь массив, чтобы найти его требования, по крайней мере, мой код выглядит чище:)
Список использованных ссылок после прочтения ответов здесь: