嵌套数组 - 在使用 for 循环嵌套时更新子数组不起作用?
Nested Arrays - updating subarrays while nesting with a for loop doesn't work?
const nestedArr = [];
// ADD CODE HERE
let arr = [];
for(let i=0; i<5; i++){
arr.push(`loop${i}`, i);
nestedArr.push(arr);
// nestedArr.push([`loop${i}`, i]);
}
console.log(nestedArr)
大家好,我只是想知道我不理解的 JS 的某些行为。当使用灰色 // nestedArr.push([
loop${i}, i]);
中的注释行时,挑战得到解决,但是当我尝试使用其他未注释的方法时
arr.push(`loop${i}`, i);
nestedArr.push(arr);
和我想的不一样
方法是首先声明一个数组arr
,每5次迭代将字符串loop${i}
和第二个元素索引i
推送给它。接下来在 5 次迭代期间将数组 arr
推入 nestedArr
。预期结果应该将 arr 推入 nestedArr 5 次,每次推入都应该在 arr 中一次添加一个元素。但是,如您所见,推入的子数组 arr 都被推入,每 5 次持有 5 个元素。当 i 为 0 时,我期待第一次迭代,子数组 arr 被推送到 nestedArr 只包含一个元素,但已经包含 5 个与其他子数组相同的元素。
[['loop0', 0, 'loop1', 1, 'loop2', 2, 'loop3', 3, 'loop4', 4], ['loop0', 0, 'loop1', 1, 'loop2', 2, 'loop3', 3, 'loop4', 4], ['loop0', 0, 'loop1', 1, 'loop2', 2, 'loop3', 3, 'loop4', 4], ['loop0', 0, 'loop1', 1, 'loop2', 2, 'loop3', 3, 'loop4', 4], ['loop0', 0, 'loop1', 1, 'loop2', 2, 'loop3', 3, 'loop4', 4]]
预期结果应该是
[['loop0', 0], ['loop1', 1], ['loop2', 2], ['loop3', 3], ['loop4', 4]]
每次迭代都在子数组 arr 中添加一个元素,然后在 5 次迭代期间将其推送到 nestedArr。
知道为什么吗?
你应该在每次循环再次开始时初始化数组arr
:
const nestedArr = [];
for (let i = 0; i < 5; i++) {
let arr = [];
arr.push(`loop${i}`, i);
nestedArr.push(arr);
}
console.log(nestedArr);
您忘记正确附加到 arr:
const nestedArr = [];
// ADD CODE HERE
let arr = [];
for(let i=0; i<5; i++){
arr.push([`loop${i}`, i]);
nestedArr.push(arr);
// nestedArr.push([`loop${i}`, i]);
}
console.log(nestedArr)
看我在推入 arr arr.push([
loop${i}, i]);
之前做了一个数组
Array 是一个对象,因此你推入最终数组 nestedArr,它实际上持有子数组的引用(arr在你的情况下)。现在,由于您将数据推送到同一个子数组 arr 中,它的引用每次都会在主数组中更新,最后当您打印输出时,它会在大批。为避免这种情况,您可以使用@Oihane Vázquez 的建议,也可以像这样直接将数据推送到主数组中
const nestedArr = [];
for (let i = 0; i < 5; i++) {
nestedArr.push([`loop${i}`, i]);
}
console.log(nestedArr);
const nestedArr = [];
// ADD CODE HERE
let arr = [];
for(let i=0; i<5; i++){
arr.push(`loop${i}`, i);
nestedArr.push(arr);
// nestedArr.push([`loop${i}`, i]);
}
console.log(nestedArr)
大家好,我只是想知道我不理解的 JS 的某些行为。当使用灰色 // nestedArr.push([
loop${i}, i]);
中的注释行时,挑战得到解决,但是当我尝试使用其他未注释的方法时
arr.push(`loop${i}`, i);
nestedArr.push(arr);
和我想的不一样
方法是首先声明一个数组arr
,每5次迭代将字符串loop${i}
和第二个元素索引i
推送给它。接下来在 5 次迭代期间将数组 arr
推入 nestedArr
。预期结果应该将 arr 推入 nestedArr 5 次,每次推入都应该在 arr 中一次添加一个元素。但是,如您所见,推入的子数组 arr 都被推入,每 5 次持有 5 个元素。当 i 为 0 时,我期待第一次迭代,子数组 arr 被推送到 nestedArr 只包含一个元素,但已经包含 5 个与其他子数组相同的元素。
[['loop0', 0, 'loop1', 1, 'loop2', 2, 'loop3', 3, 'loop4', 4], ['loop0', 0, 'loop1', 1, 'loop2', 2, 'loop3', 3, 'loop4', 4], ['loop0', 0, 'loop1', 1, 'loop2', 2, 'loop3', 3, 'loop4', 4], ['loop0', 0, 'loop1', 1, 'loop2', 2, 'loop3', 3, 'loop4', 4], ['loop0', 0, 'loop1', 1, 'loop2', 2, 'loop3', 3, 'loop4', 4]]
预期结果应该是
[['loop0', 0], ['loop1', 1], ['loop2', 2], ['loop3', 3], ['loop4', 4]]
每次迭代都在子数组 arr 中添加一个元素,然后在 5 次迭代期间将其推送到 nestedArr。 知道为什么吗?
你应该在每次循环再次开始时初始化数组arr
:
const nestedArr = [];
for (let i = 0; i < 5; i++) {
let arr = [];
arr.push(`loop${i}`, i);
nestedArr.push(arr);
}
console.log(nestedArr);
您忘记正确附加到 arr:
const nestedArr = [];
// ADD CODE HERE
let arr = [];
for(let i=0; i<5; i++){
arr.push([`loop${i}`, i]);
nestedArr.push(arr);
// nestedArr.push([`loop${i}`, i]);
}
console.log(nestedArr)
看我在推入 arr arr.push([
loop${i}, i]);
Array 是一个对象,因此你推入最终数组 nestedArr,它实际上持有子数组的引用(arr在你的情况下)。现在,由于您将数据推送到同一个子数组 arr 中,它的引用每次都会在主数组中更新,最后当您打印输出时,它会在大批。为避免这种情况,您可以使用@Oihane Vázquez 的建议,也可以像这样直接将数据推送到主数组中
const nestedArr = [];
for (let i = 0; i < 5; i++) {
nestedArr.push([`loop${i}`, i]);
}
console.log(nestedArr);