我用以下方式创建了一个样本数组:
var data = new Array(8);
...
data[n].push([x, y]);
其中n是通道(0-7),[x,y]是所选通道的当前样本。 对于特定的应用程序,我需要保持x值不变(0,1,2,3,... m),并在每次获得新样本时移动y值。
m = 3的简单示例。第一次加载后我有:
data[0] -> [0, 2] [1, 4] [2, 6]
当收到新样本时,我想像这样更改数组:
data[0] -> [0, 4] [1, 6] [2, 8]
因为m的值可能高达5000,我想知道哪种方法最好。 当然,我可以循环整个数组,将位置j的y值更改为位置j + 1的y值。
还有更好的东西吗? 谢谢!
答案 0 :(得分:0)
替代答案提供了
然后
// push the value of the sample, not X, just Y
data[0].push(value)
// remove the first element from the array.
data[0].shift()
x是数组的索引。
在性能方面,我不会更改源数组,而是更改访问器功能。
所以你可以在阅读时提供一个提供转变的课程,例如: ShiftedArray类,其中通道是数据[z] :
var shifter = 0
function get(index) {
return [channel[index][0], channel[index + this.shifter][1]];
}
然后你可以提供增加班次:
function increase() {
this.shifter++;
}
或减少它:
function increase() {
this.shifter--;
}
然后访问数组数据:
var item1 = shiftedArray.get(0);
// shall return [0, 2]
shiftedArray.increase();
var item2 = shiftedArray.get(0);
// shall return [0, 4]
以上只是概念性代码,未经测试,您应该添加边界检查。
答案 1 :(得分:0)
您可以使用Array.map更改数组中的每个项目,而无需显式循环。
var data = [
[0,2], [1,4], [2,6]
];
function update(data) {
data.map(function(item,key) {
if(key+1>data.length-1) return;
data[key][1] = data[key+1][1];
});
// if we shift, the last item Y should have empty value
data[data.length-1][1] = undefined;
}
update(data);
console.log(data); // [0,4], [1,6], [2,undefined]
请参阅the fiddle。
你可能也喜欢这个由@ rab的解决方案启发的黑魔法
var data = [ [0,2], [1,4], [2,6] ];
data.map(function(_,i,o){o[i][1]=o[++i]&&o[i][1]});
console.log(data); // [0,4], [1,6], [2,undefined]
答案 2 :(得分:0)
尝试将data
拆分为两个单独的数组,并使用第二个数组,如Circular buffer。