0rislav
@0rislav
Юрист, который рвется в программисты! =)

Почему в массиве иногда выпадает значение undefined?

Ребят, поясните пожалуйста где просчет в моем алгоритме?
var deck = {
        allCards: ["ch-6", "ch-7", "ch-8", "ch-9", "ch-10", "ch-v", "ch-d", "ch-k", "ch-t", "bu-6", "bu-7", "bu-8"],
        randomCards: [],
        randomizer: function(min, max) {
            var i = 0;
            while(i < deck.allCards.length) {
            var rand = Math.round(Math.random() * (max-min - 1));
            var copyCard = deck.randomCards.push(deck.allCards[rand]);
            var cutCard = deck.allCards.splice(rand, 1);
            i++;
            //console.log(deck.randomCards);
            //console.log(deck.allCards);
            console.log(rand);
            console.log(cutCard);
            console.log(copyCard);
            }
        }
    };

    deck.randomizer(0, deck.allCards.length);
  • Вопрос задан
  • 119 просмотров
Решения вопроса 1
abyrkov
@abyrkov
JavaScripter
1. Начнем с того, что while - это плохой знак. desk во внутренней функции тоже плохо, лучше использовать this
Отрефакторим -
var deck = {
        allCards: ["ch-6", "ch-7", "ch-8", "ch-9", "ch-10", "ch-v", "ch-d", "ch-k", "ch-t", "bu-6", "bu-7", "bu-8"],
        randomCards: [],
        randomizer: function(min, max) {
          for(var i = 0; i < this.allCards.length; i++) {
            var rand = Math.round(Math.random() * (max - min - 1));
            this.randomCards.push(this.allCards[rand]);
            this.allCards.splice(rand, 1);
        }
    }
};
deck.randomizer(0, deck.allCards.length);

2. Потом мелкая ошибка в радоме - забыли прибавить min
var deck = {
        allCards: ["ch-6", "ch-7", "ch-8", "ch-9", "ch-10", "ch-v", "ch-d", "ch-k", "ch-t", "bu-6", "bu-7", "bu-8"],
        randomCards: [],
        randomizer: function(min, max) {
          for(var i = 0; i < this.allCards.length; i++) {
            var rand = min + Math.round(Math.random() * (max - min - 1));
            this.randomCards.push(this.allCards[rand]);
            this.allCards.splice(rand, 1);
        }
    }
};
deck.randomizer(0, deck.allCards.length);

3. И, наконец, ошибка логики - мы splic'им массив, значит длинна его тоже уменьшается... но рандом остается тем же - от 0 до предыдущей длины. Придется убрать min и max - с такой логикой их добавить невозможно - они будут вызывать проблемы.
var deck = {
        allCards: ["ch-6", "ch-7", "ch-8", "ch-9", "ch-10", "ch-v", "ch-d", "ch-k", "ch-t", "bu-6", "bu-7", "bu-8"],
        randomCards: [],
        randomizer: function(min, max) {
          for(var i = 0; i < this.allCards.length; i++) {
            var rand = Math.round(Math.random() * (this.allCards.length - 1));
            this.randomCards.push(this.allCards[rand]);
            this.allCards.splice(rand, 1);
        }
    }
};
deck.randomizer();

4. И, наконец, правильная логика:
var deck = {
        allCards: ["ch-6", "ch-7", "ch-8", "ch-9", "ch-10", "ch-v", "ch-d", "ch-k", "ch-t", "bu-6", "bu-7", "bu-8"],
        randomCards: [],
        randomizer: function(min, max) {
          for(var i = 0; i < this.allCards.length; i++) {
            var rand = min + Math.round(Math.random() * ((max > this.allCards.length ? this.allCards.length : max) - min - 1));
            this.randomCards.push(this.allCards[rand]);
            this.allCards.splice(rand, 1);
        }
    }
};
deck.randomizer(0, deck.allCards.length);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы