在javascript/p5js中复制数组,将所有值转换为0?
我有这个简单的代码,我试图保留一个数组,这只是FFT音频数据。我认为这是一个javascript问题,但我不确定到底出了什么问题。analyze()只返回一个数字数组。我将数组推入数组频谱后,频谱中的所有值都是0,而不是实际值。使用array.splice(0)应该是深度副本。有人能告诉我我做错了什么吗在javascript/p5js中复制数组,将所有值转换为0?,javascript,arrays,processing,fft,p5.js,Javascript,Arrays,Processing,Fft,P5.js,我有这个简单的代码,我试图保留一个数组,这只是FFT音频数据。我认为这是一个javascript问题,但我不确定到底出了什么问题。analyze()只返回一个数字数组。我将数组推入数组频谱后,频谱中的所有值都是0,而不是实际值。使用array.splice(0)应该是深度副本。有人能告诉我我做错了什么吗 var fft,mic; function setup(){ var myCanvas = createCanvas(800,800); fft = new p5.FFT(); e
var fft,mic;
function setup(){
var myCanvas = createCanvas(800,800);
fft = new p5.FFT();
ellipse(400,400,50,50)
colorMode(HSB,100)
spectrums=[]
mic = new p5.AudioIn();
mic.start();
fft = new p5.FFT();
fft.setInput(mic);
}
function draw() {
background(255)
s = fft.analyze(16)
for(si=0;si<s.length;si++){
fill(s[si]%100,100,100)
rect(si*10,0,si*10,s[si])
}
spectrums.push(s.splice(0))
if(spectrums.length > 5){
spectrums.splice(-1,1)
}
console.log(spectrums[0][0]) //this prints 0 always
for(si=0;si<spectrums[0].length;si++){
fill(spectrums[0][si]%100,100,100)
rect(si*10,400,si*10,spectrums[0][si])
}
}
var-fft,mic;
函数设置(){
var myCanvas=createCanvas(800800);
fft=新的p5.fft();
椭圆(400400,50,50)
彩色模式(HSB,100)
光谱=[]
麦克风=新的p5.AudioIn();
mic.start();
fft=新的p5.fft();
fft.setInput(mic);
}
函数绘图(){
背景(255)
s=fft.分析(16)
对于(si=0;si 5){
光谱.拼接(-1,1)
}
console.log(spectrums[0][0])//这将始终打印0
对于要使用的(si=0;si)
而不是
那你在干什么
spectrums.push(s.splice(0))
s
从一开始就被清空(0索引)
你想做的是
spectrums.push(s.slice(0))
slice()
保持原始数组不变,只创建一个副本
另一方面,splice()
只是通过插入或删除元素来修改原始数组。这是我的错。问题是使用unshift而不是pop。
它得到的第一个数组中满是0。
在这里,您可以看到我想做的:如果您想将数组的所有值都设置为零,您可以执行arr.map(c=>0)如果您发布的是一个而不是此代码,那么您的运气会更好,因为此代码依赖于硬件输入,因此运行起来非常困难。请尝试创建一个小示例程序,该程序仅使用硬编码数组来准确显示您正在尝试做的事情。splice
!=slice
此代码是可运行的,下面是它运行的完整链接:它应该具有这些图中有2个出现了,但只有1个出现了。我只是尝试了slice(),我得到了完全相同的问题。我以前尝试过许多不同的复制机制,如JSON.parse(JSON.stringify(myArray)),但都不起作用。我不知道该怎么做。我确信fft.analyze()是正确的返回一个普通数组:我确定这是一个javascript问题,但我不知道如何修复它。毫无意义…在slice
之后和之前,您的s
数组应该仍然充满数据。