javascript - 如何创建一个由订单号 : array within array, 宾果卡和循环陷阱组成的正方形......

标签 javascript arrays loops

我发布的问题应该是一个非常简单的问题,但我很难弄清楚我哪里出了问题。

我正在尝试创建一张 n x n 大小的宾果卡。因此,将有一个长度为 n 的数组(从上到下的线),其中的每个元素将包含另一个长度为 n 的数组(各个方 block ),每个元素其中的元素将包含一个对象来描述该方 block 的状态(数字,无论是否已找到)。作为概念证明,我只是用数字 1 到 n x n 填充方 block ,并稍后对数字进行洗牌。因此:

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 } ],

这一定是一个循环陷阱——或者是我的代码中的一些悲惨错误——但经过长时间思考后我没有看到它。错误出在哪里呢?感谢您的帮助。

最佳答案

您需要为每个循环提供一个新数组,而不引用旧数组。

移动

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; }

关于javascript - 如何创建一个由订单号 : array within array, 宾果卡和循环陷阱组成的正方形......,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50630765/

相关文章:

oracle - (Oracle) 如何在循环内获取总和值?

javascript - 通过点击父节点名称 jsTree 获取子节点

javascript - 如何使谷歌饼图api背景透明

Java - 如何在属于对象数组的对象内查找变量的值?

ruby - 按数字(从大到大)然后按字母(字母顺序)对对象集合进行排序

java - 在 Mule 3.4 中模拟 while 循环

javascript - Firestore 更新数据未捕获( promise )FirebaseError : Missing or insufficient permissions

javascript - 将数组中的字符串值连接到 MongoDB 的单个字段中

javascript - 向多维 javascript 数组添加新条目

java - 结果没有初始化?