For 循环只给出数组的最后一个值

Posted

技术标签:

【中文标题】For 循环只给出数组的最后一个值【英文标题】:For loop only gives the last value of an array 【发布时间】:2019-07-07 11:12:12 【问题描述】:

我一直在尝试在 ES6 中转置一个矩阵(类似二维数组),但 for 循环只给出原始数组的最后一个值,我不知道我做错了什么。

假设频谱阵列的大小为 128 x 128:

const width = 128;
const height = 128;

var spectrum: Complex[][] = fft(data);

// Transpose spectrum array
var transposedData: Complex[][] = new Array(height).fill(new Array(width));
for (let y = 0; y < height; y++) 
    for (let x = 0; x < width; x++) 
        const c = spectrum[x][y].deepCopy();
        transposedData[y][x] = c;
    


spectrum = transposedData;
console.log(spectrum);

这给了我一个二维数组,其中的每个元素都是频谱[127][127] 的值。 我做错了什么?

【问题讨论】:

const c 在循环内部感觉不正确....有趣的是,您在其他地方使用 var。可能应该是letlet c 在循环之外 需要找到 fill() 的欺骗......你正在用相同的数组填充每一行...... 我猜deepCopy 没有按照您的想法进行操作,并且您正在经历对象突变:***.com/questions/42416863/avoiding-object-mutation 与var和copy无关 deepCopy 使用与原始 Complex 对象相同的值返回一个新的 Complex 对象,例如 deepCopy() return new Complex(this.real, this.imag)。这似乎会引发对象突变? 【参考方案1】:

找不到骗子,但是当您使用 fill() 时,它不会为每个索引创建一个新数组,而是使用相同的数组。

你的代码基本上就是这样

    var myArr = new Array(3);
    var row = new Array(3);
    myArr[0] = row;
    myArr[1] = row;
    myArr[2] = row;
    myArr[0][0] = 1;
    console.log(myArr[0][0], myArr[1][0], myArr[2][0])

因此,当您更改索引时,它会更改所有数组的所有索引。无法通过填充来创建数组的新实例,因此您必须进行一些编码。

您需要使用 map() 来获取不同的数组。由于 map 仅适用于定义的值,因此您必须先用一些东西填充它。

var foo = new Array(3).fill(null).map(() => new Array(3))
foo[0][0] = 1
console.log(foo)

【讨论】:

我根据你的回答修复了我的代码,现在脚本就像一个魅力:) 非常感谢!

以上是关于For 循环只给出数组的最后一个值的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 for 循环只读取我创建的数组的最后一个元素? [复制]

浅谈for each循环

浅谈for each循环

homework2:给出代码,回答问题

For循环没有给出预期的重复

闭包循环问题-for循环只显示最后一个i的值