Mam problem, który mnie na chwilę sięgał.

Mam 14 divów, których każdy musi być przypisany losowy identyfikator (od 1 do 14) za każdym razem, gdy obciążenia strony. Każda z tych div ma klasę "

Mam kod JS, który działa, aby przypisać losowe identyfikatory, ale mam kłopoty, nie otrzymując ten sam identyfikator, aby przypisać dwukrotnie.

JavaScript

var used_id = new Array();

    $( document ).ready(function() {
        assign_id();

        function assign_id()
        {
            $('.image-box').each(function (i, obj) {
                random_number();
                function random_number(){
                number = 2 + Math.floor(Math.random() * 14);
                var box_id = 'box' + number;

                if((box_id.indexOf(used_id) !== -1) === -1)
                    {
                        $(this).attr('id',box_id);
                        used_id.push(box_id);
                    }


                else
                    {
                    random_number();
                    }   
                }
            });

        }

    });

Dzięki za pomoc,

Twoje zdrowie

0
Ellery 10 grudzień 2013, 09:32

5 odpowiedzi

Najlepsza odpowiedź

Myślę, że jest to, co chcesz, a Demo

$(document).ready(function() {
    assign_id();
});
function assign_id() {
    var numberOfDiv = $('.image-box').length;
    var listOfRandomNumber = myFunction(numberOfDiv);
    $('.image-box').each(function(i, obj) {
        $(this).attr("id",listOfRandomNumber[i]);
    });
};

//Getting List Of Number contains 1 to the number of Div which is 
//14 in this case.
function myFunction(numberOfDiv ) {
    for (var i = 1, ar = []; i < numberOfDiv +1 ; i++) {
        ar[i] = i;
    }
    ar.sort(function() {
        return Math.random() - 0.5;
    });
    return ar;
};
2
F.C.Hsiao 10 grudzień 2013, 06:48

Mmm, Random ...

Zamiast używać losowo wygenerowanego numeru (który, jak doświadczanie, może losowo powtórzyć wartości) wystarczy użyć przyrostowo zaktualizowanego licznika podczas przypisywania identyfikatorów.

function assign_id() {
    var counter = 0;
    $('.image-box').each(function (i, obj) {
       $(this).attr('id','image-box-' + counter++); }   
    });
}
4
adamb 10 grudzień 2013, 05:37

Proponuję mieć globalną tablicę, jakbyś miał dla użytkownika_ID i pchnąć przypisane identyfikatory div w tablicy. Następnie możesz sprawdzić przed przypisaniem losowego identyfikatora do div. Jeśli jest przypisany, należy użyć innego.

Mam nadzieję że to pomoże.

Twoje zdrowie.

0
Dirgh 10 grudzień 2013, 05:36

Najpierw jak używasz mojego wdrożenia:

var takeOne = makeDiminishingChoice(14);

W tym przypadku takeOne jest funkcją, którą możesz zadzwonić do 14 razy, aby uzyskać unikalną liczbę losową między 1 a 14.

Na przykład to spowoduje wyświetlenie liczb między 1 a 14 w kolejności losowej:

for (var i = 0; i < 14; i++) {
        console.log(takeOne());
}

I oto implementacja sama makeDiminishingChoice:

var makeDiminishingChoice = function (howMany) {

        // Generate the available choice "space" that we can select a random value from.
        var pickFrom = [];
        for (var i = 0; i < howMany; i++) {
                pickFrom.push(i);
        }

        // Return a function that, when called, will return a value from the search space,
        // until there are no more values left.
        return function() {

                if (pickFrom.length === 0) {
                        throw "You have requested too many values. " + howMany + " values have already been used."
                }

                var randomIndex = Math.floor(Math.random() * pickFrom.length);
                return pickFrom.splice(randomIndex, 1)[0];
        };
};
0
Nick Zalutskiy 10 grudzień 2013, 06:30

Lepiej jest użyć wartości przyrostowych (lub coś w rodzaju (nowej daty) .GetTime ()), jeśli chcesz, to przypisać unikalne wartości. Ale jeśli z jakiegoś powodu musisz mieć losowo wybrane wartości (tylko z 1-14), a następnie użyj czegoś takiego, aby wybrać unikalne / losowe wartości

var arrayId = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14];

function getRandomId(array) {
    var randomIndex = Math.floor(Math.random() * (array.length));
    var randomId = array.splice(randomIndex, 1);
    return randomId[0];
}

Teraz getRandomId(arrayId) zwróciłby losowo wybraną wartość z tablicy, a następnie wyjmij tę wartość, aby nie była powtórzona.

0
tewathia 10 grudzień 2013, 06:39