Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Don't repeat yourself - Potrzebuje pomocy
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
E30Tomas
Witam
Jestem laikiem w programowaniu, znam się tylko na podstawach, ale wklepywanie kodu i wymyślanie coś samemu bardzo mnie cieszy. Wymyśliłem sobie, że napiszę mały programik, który będzie pobierał od użytkownika cyfrę i kilka stringów, program będzie losował pomiędzy tymi stringami. To taki mały Randomizer.
np.
lotting(3, "Ktos mi pomoze", "nikt mi nie pomoze", "moze mi pomoga");

I w tym momencie funkcja lotting zwraca jeden z tych stringów. np. "moze mi pomoga"

W czym problem:
Manualnie napisałem 10 stringów, które pobiera program, ale chciałbym żeby mógł pobierać np. 100 stringów
o ile tego raczej nie przeskoczę i będę musiał tutaj wprowadzać zmienne manualnie: var lotting = function(quantity, str0, str1, str2, str3, str4, str5, str6, str7, str8, str9)

to chciał bym aby to kompilator zrobil za mnie to:
str[0] = str0;
str[1] = str1;
str[2] = str2;

Czy jest to w ogóle możliwe?

Aby łatwiej było zrozumieć kod: var array przetrzymuje cyfry, a var str stringi. to tak jakby kontener dwuwymiarowy. kiedy np. array[4] = counter, to str[4] będzie zwrócone jako wynik tego losowania. Używam countera, ponieważ uznałem, że math.Random() jest zbyt przewidywalne w wynikach, tak więc math.Random() jest wykonywane kilkadziesiąt razy zanim, któraś ze stringów będzie wylosowana. Mam nadzieję, że zrozumiecie działanie kodu i o co mi chodzi.

Podaje część kodu:

CODE
var counter = 100;
var str = new Array(100);
var array = new Array(100);

var lotting = function(quantity, str0, str1, str2, str3, str4, str5, str6, str7, str8, str9)
{
var emptyingVar = function()
{
for(var i = 0 ; i < str.length ; i++){
str[i] = "Empty var";
}
};
var lottingEngine = function(quantityVar)
{
for(var j = 0; j < array.length ; j++){
array[j] = 0;
}
loop:
for(var i = 0 ; i < quantityVar*counter ; i++){
x = Math.floor(Math.random()*quantityVar);
for(var i0 = 0 ; i0 < quantityVar ; i0++){
if(x === i0){
array[i0]++;
}
}
for(var i1 = 0 ; i1 < quantityVar ; i1++){
if(array[i1] === counter){
return str[i1];
//break loop;
}
}
}
};
var convertingStrToStr = function()
{
str[0] = str0;
str[1] = str1;
str[2] = str2;
str[3] = str3;
str[4] = str4;
str[5] = str5;
str[6] = str6;
str[7] = str7;
str[8] = str8;
str[9] = str9;
};
emptyingVar();
convertingStrToStr();

for(var i = quantity; i < 10 ; i++){
str[i] = "Empty var";
}

var result = lottingEngine(quantity);
return result;
};
Sephirus
JS ma do tego obsługę smile.gif

[JAVASCRIPT] pobierz, plaintext
  1. function lotting(number) { // zauważ że nie deklaruje żadnych dodatkowych argumentów ale wszystkie są dostępne w zmiennej "arguments"
  2. arguments.shift(); // wyrzucam pierwszy element (bo to jest nasz "number")
  3. var phrases = arguments;
  4.  
  5. // i tyle ;) od razu pod phrases masz wszystkie teksty jako tablica
  6.  
  7. }
  8.  
[JAVASCRIPT] pobierz, plaintext


Rozwiązanie to nie jest i tak idealne... i tego się tak nie robi jeśli tych dodatkowych argumentów może być naprawdę dużo. Lepiej jest po prostu przekazać funkcji od razu tablicę.

[JAVASCRIPT] pobierz, plaintext
  1. function lotting(number,phrasesArray) {
  2. // ...
  3. }
  4.  
  5. var teksty = ['a','b','c','d'];
  6. lotting(3,teksty);
  7.  
  8. // lub:
  9.  
  10. lotting(3,['a','b','c','d']);
  11.  
[JAVASCRIPT] pobierz, plaintext
PrinceOfPersia
[JAVASCRIPT] pobierz, plaintext
  1. function Lotting(phrasesArray) {
  2.  
  3. var phrases; // zmienna robocza
  4. function init () { // funkcja inicjalizujaca
  5. phrases = phrasesArray.slice(0); //kopiujemy zawartosc phrasesArray do zmiennej roboczej
  6. phrases.sort(function() { return Math.random()-0.5;}); // mieszamy tablice randomową funkcją
  7. }
  8.  
  9. return function () {
  10. if (!phrases || !phrases.length)
  11. init();
  12. return phrases.pop(); // zdejmujemy element z tablicy roboczej
  13. }
  14. }
  15.  
  16. var lotting = new Lotting(["Ktos mi pomoze", "nikt mi nie pomoze", "moze mi pomoga"]);
  17.  
  18. // teraz zmienna lotting zawiera spreparowana funkcje:
  19.  
  20. alert(lotting() );
  21. alert(lotting() );
  22. alert(lotting() );
  23. alert(lotting() );
[JAVASCRIPT] pobierz, plaintext


smile.gif
E30Tomas
Dziękuję bardzo za pomoc, bardzo dobry i przydatny pomysł, aby użyć Array zamiast pojedynczych zmiennych.

Pozdrawiam
E30Tomas

Temat do zamknięcia
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.