有被低估的风险,我发布了一个非常简单的问题,但我很难弄清楚我哪里出错了。在你投票之前,请注意我已经盯着这段时间试图查看我的错误,这是一个(令人尴尬的)最后的手段。
我试图创建大小的宾果卡 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 } ],
这必须是一个循环陷阱 - 或者我的代码中有一些悲剧性的错误 - 但是经过很长时间的思考后我都没有看到它。错误在哪里?谢谢你的帮助。
答案 0 :(得分:3)
你需要为每个循环创建一个新数组,而不需要引用旧数组。
移动
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);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#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;
答案 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
来实际重置