如何创建一个订货号的正方形:数组内的数组,宾果卡和循环陷阱......

时间:2018-05-31 18:39:10

标签: javascript arrays loops

有被低估的风险,我发布了一个非常简单的问题,但我很难弄清楚我哪里出错了。在你投票之前,请注意我已经盯着这段时间试图查看我的错误,这是一个(令人尴尬的)最后的手段。

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

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 :(得分:3)

你需要为每个循环创建一个新数组,而不需要引用旧数组。

移动

let lineArray = [];

在第一个for循环内。

&#13;
&#13;
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);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;

一个简短的方法是创建新的数组并映射对象。

&#13;
&#13;
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);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;

答案 1 :(得分:2)

您正尝试使用以下命令重置lineArray: def copyGroovy = { p1, p2 -> copy(p1,p2) } def copyFixP1 = { p1 -> copyGroovy.curry(p1) } def cp = // How to define this?

这不起作用,您需要执行cp src dest 来实际重置