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
。可能应该是let
和let 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 循环只给出数组的最后一个值的主要内容,如果未能解决你的问题,请参考以下文章