1

我通过以下方式创建了一个样本数组:

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 值。

有更好的吗?谢谢!

4

3 回答 3

0

替代答案提供了

  • 一个样本是 [x, y]
  • x 是一个序列 0, 1, 2, ..., m(没有间隙),当您收到一个新样本时,您会:

然后

// 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 类,其中channel 是 data[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]

以上只是概念代码,没有经过测试,你应该添加边界检查。

于 2013-06-08T08:22:50.333 回答
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]

小提琴

您可能还喜欢评论中@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]
于 2013-06-08T08:24:57.077 回答
0

尝试拆分data两个单独的数组并使用第二个数组,如Circular buffer

于 2013-06-08T08:31:44.303 回答