我正在尝试平滑一个数字列表,出于图形目的,我不想绘制超过5000个项目的图表,因为渲染需要太长时间,而我们不需要额外的数据
想象一下,我们有一个简单的清单:
let v = [1,2,3]; // max size is 3
我们想在列表中添加一个新的数据点:
v.push(4);
但我们需要将列表长度保持为3项。所以我们需要做这样的事情:
v = [ (1+2)/2, (2+3)/3, (3+4)/4 ];
这样,数组中只有3个项目,但我们合并了所有数据。
我有一些代码,我认为这样做,但我无法弄清楚为什么它会给我一些奇怪的结果,在这种情况下,大小上限为10,而不是3:
const util = require('util');
let x = 1;
const values = [];
setInterval(function(){
values.push(x++);
if(values.length > 10){
let prev = values.shift(), curr, i = 0;
while(true){
curr = values[i];
values[i] = (prev + curr)/2;
if(!values[i+1]){
break;
}
prev = curr;
i++;
}
console.log('after', x, 'new values array:\n', util.inspect(values));
}
},100);
结果如下:
after: 53 , new values array:
[ 33.00017937119628,
35.00004360157914,
37.00000921602168,
39.0000016674212,
41.00000025298232,
43.00000003129708,
45.000000003031346,
47.00000000021555,
49.000000000010004,
51.00000000000023 ]
after: 54 , new values array:
[ 34.00011148638771,
36.00002640880041,
38.00000544172144,
40.00000096020176,
42.0000001421397,
44.00000001716421,
46.00000000162345,
48.00000000011278,
50.000000000005116,
52.000000000000114 ]
after: 55 , new values array:
[ 35.00006894759406,
37.000015925260925,
39.0000032009616,
41.00000055117073,
43.000000079651954,
45.00000000939383,
47.00000000086811,
49.00000000005895,
51.000000000002615,
53.00000000000006 ]
after: 56 , new values array:
[ 36.00004243642749,
38.00000956311126,
40.000001876066165,
42.00000031541134,
44.00000004452289,
46.00000000513097,
48.00000000046353,
50.00000000003078,
52.000000000001336,
54.00000000000003 ]
但最终,可能是因为浮点数,我开始看到这个:
after: 121 , new values array:
[ 101, 103, 105, 107, 109, 111, 113, 115, 117, 119 ]
after: 122 , new values array:
[ 102, 104, 106, 108, 110, 112, 114, 116, 118, 120 ]
after: 123 , new values array:
[ 103, 105, 107, 109, 111, 113, 115, 117, 119, 121 ]
after: 124 , new values array:
[ 104, 106, 108, 110, 112, 114, 116, 118, 120, 122 ]
可能是因为浮点数,但很奇怪。
"正确" 结果我看到的是随着时间的推移已经通过阵列的所有数字的有限点样本。 p>
这样的事情:
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22]
可以采样并减少到这样的结果:
[1.4, 4.5, 11.2, 16.3, 21.6]
希望这是有道理的。
答案 0 :(得分:1)
不确定在几次读取后我是否正确理解了这个问题,但是在分配新数组值时,您应该使用:
Math.floor( (prev + curr) / 2 )
返回Int或( (prev + curr) / 2).toFixed(2)
返回Float。
另外,我会明确说明你在数组中保留了多少个值。阅读
令人困惑 values.push(x++);
if(values.length > 10){
while(true)
if(!values[i+1]){
break;
}
}
}