Рандомизировать дочерние элементы и переназначать как дочерние элементы отдельного узла в Javascript

#javascript #arrays

#javascript #массивы

Вопрос:

При подготовке объектов для игры, которую я создаю на javscript, я считываю в объекте JSON deckData и добавляю каждый из них как дочерний элемент this.discard . Затем я планирую задание, которое проверяет, является ли это.deck пуст. Если это так, то функция должна перетасовать массив карт, перечисленных как дочерние элементы this.discard, а затем назначить их дочерними элементами this.deck .

Кажется, что весь процесс работает довольно гладко, за исключением ключевой строки, где я пытаюсь назначить заново перетасованный массив поверх:

 this.deck.children_ = this.shuffle(this.discard.children_);
  

Я ищу решение, которое успешно добавит все элементы, которые были дочерними элементами this.discard как дочерние элементы this.deck . И я понимаю, что я еще не очищаю массив от этого.отбрасывайте пока тоже, но по одному шагу за раз. Полный фрагмент кода выглядит следующим образом:

 sideboard = function(game) {

    this.discard = new lime.Layer();
    this.appendChild(this.discard);
    for (var key in deckData) {
        var cardData = deckData[key];
        this.addCard(cardData);
    };

    this.mythosDeck = new lime.Layer();
    this.appendChild(this.mythosDeck);

    lime.scheduleManager.schedule(this.deckShuffler, this);
};

sideboard.prototype.deckShuffler = function() {
    if (this.deck.children_.length < 1) {
        this.deck.children_ = this.shuffle(this.discard.children_);
    }
};

sideboard.prototype.shuffle = function(array) {
    var tmp, current, top = array.length;

    if(top) while(--top) {
        current = Math.floor(Math.random() * (top   1));
        tmp = array[current];
        array[current] = array[top];
        array[top] = tmp;
    }

    return array;
};
  

Ответ №1:

Разве вы не хотите просто объединить два массива и затем переназначить? Например:

 this.deck.children_ = this.deck.children_.concat(this.shuffle(this.discard.children_));
  

Комментарии:

1. Учитывая то, как вы это там написали, не подумает ли браузер, что children_ — это функция, которой передается аргумент ‘this.shuffle …’, хотя? Я согласен с тем, что вы предлагаете мне сделать, но я предполагаю, что мое понимание назначения переменных в JS невелико — я предположил, что, учитывая то, как у меня это было, функция shuffle вернет массив, который будет назначен this.deck.children_ . На самом деле это доказало обратное.

2. Я устал и умудрился пропустить слово «concat», которое было самой важной частью этого. Теперь я это исправил. 🙂

3. Ха, я как раз собирался спросить, так ли это. Это работает отлично, спасибо!