Как создать квадрат порядковых чисел: массив в массиве, карточки бинго и циклы… - PullRequest
0 голосов
/ 31 мая 2018

Риск быть пониженным, я публикую то, что должно быть очень простой проблемой, но мне трудно понять, где я иду не так, как надо.Прежде чем понизить голос, пожалуйста, поймите, что я смотрел на это в течение некоторого времени, пытаясь увидеть свою ошибку, и это (неловкое) последнее средство.

Я пытаюсь создать карту бинго nxn* Размер 1004 *Таким образом, будет массив длиной n (строки сверху вниз), каждый элемент которого будет содержать другой массив длиной n (отдельные квадраты), каждый элементкоторый будет содержать объект для описания состояния этого квадрата (число, было ли оно найдено или нет).В качестве доказательства концепции я просто заполняю квадраты числами от 1 до nxn и буду перетасовывать числа позже.Таким образом:

bingo = {
    card: [],

    createCard: function (size) {
        this.card.length = 0; // empty card
        size = Math.abs(+size) || 15; // should be positive and greater than 0

        let lineArray = [];

        for (let i = 0, n = 0; i < size; i++) {
            lineArray.length = 0;
            for (let j = 0; j < size; j++) {

                lineArray.push({line: i, num: ++n, checked: false});
            }
            this.card.push(lineArray);
        }
    }
}
    bingo.createCard(15);

Проблема в том, что каждая из строк одинакова.Это происходит в каждом i - вся карта заполнена линиями одинаковых значений,

[ { line: 1, num: 16, checked: false },
    { line: 1, num: 17, checked: false },
    { line: 1, num: 18, checked: false },
    { line: 1, num: 19, checked: false },
    { line: 1, num: 20, checked: false },
    { line: 1, num: 21, checked: false },
    { line: 1, num: 22, checked: false },
    { line: 1, num: 23, checked: false },
    { line: 1, num: 24, checked: false },
    { line: 1, num: 25, checked: false },
    { line: 1, num: 26, checked: false },
    { line: 1, num: 27, checked: false },
    { line: 1, num: 28, checked: false },
    { line: 1, num: 29, checked: false },
    { line: 1, num: 30, checked: false } ] ]

, заканчивающимися заполнением последней карты 15 строками

[ { line: 14, num: 211, checked: false },
    { line: 14, num: 212, checked: false },
    { line: 14, num: 213, checked: false },
    { line: 14, num: 214, checked: false },
    { line: 14, num: 215, checked: false },
    { line: 14, num: 216, checked: false },
    { line: 14, num: 217, checked: false },
    { line: 14, num: 218, checked: false },
    { line: 14, num: 219, checked: false },
    { line: 14, num: 220, checked: false },
    { line: 14, num: 221, checked: false },
    { line: 14, num: 222, checked: false },
    { line: 14, num: 223, checked: false },
    { line: 14, num: 224, checked: false },
    { line: 14, num: 225, checked: false } ],

это должно быть петля - или какая-то трагическая ошибка в моем коде - но я не вижу ее после долгих размышлений.Где лежит ошибка?Спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Вам необходимо иметь для каждого цикла новый массив без ссылки на старый массив.

Перемещение

let lineArray = [];

внутри первого цикла for.

var bingo = {
        card: [],
        createCard: function (size) {
            this.card.length = 0; // empty card
            size = Math.abs(+size) || 15; // should be positive and greater than 0
            for (let i = 0, n = 0; i < size; i++) {
                let lineArray = [];
                for (let j = 0; j < size; j++) {
                    lineArray.push({
                        line: i,
                        num: ++n,
                        checked: false
                    });
                }
                this.card.push(lineArray);
            }
        }
    };

bingo.createCard(15);

console.log(bingo.card);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Короткий подход заключается в создании новых массивов и сопоставлении объектов.

var bingo = {
        card: [],
        createCard: function (length) {
            length = Math.abs(+length || 15);
            this.card = Array.from(
                { length },
                (_, i) => Array.from(
                    { length },
                    (_, j) => ({ line: i, num: i * length + j, checked: false })
                )
            );
        }
    };

bingo.createCard(15);

console.log(bingo.card);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 31 мая 2018

Вы пытаетесь сбросить lineArray с помощью: lineArray.length = 0;

Это не сработает, вместо этого вам нужно будет сделать lineArray = [];, чтобы фактически сбросить его

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...