javascript - 如何在javascript中压缩/简化/缩小数字数组
问题描述
目前我一直在尝试缩短数值数组,而不会使数据值彼此失去相对性。
所以首先这里是一个例子:假设一个长度为 5 的数组
var test = [ 1.0, 0.5, 0.2, 0.5, 1.0 ]; // sum = 3.2
现在我们想将它缩短到 4 的长度,而不改变或丢失它将显示为例如图形的“曲线”。
// wanted output = [ 1.125, 0.475, 0.475, 1.125 ] // sum = 3.2
我试图在很多不同的搜索词下找到它,但找不到任何我想要做的示例代码。
解决方案
为了实现这一点,可变数组长度和“目标”长度不一定是彼此的倍数,我想出了以下代码:
function compressArrayData(arr, toLen) {
if (!Array.isArray(arr) || isNaN(toLen) || arr.length < toLen) throw "ArgumentError";
var sizeRatio = arr.length / toLen;
var results = [];
var resIndx = 0;
var rest = 0;
var lastRatio = sizeRatio;
var lastVal = 0;
for (var i = 0; i < arr.length; i++) {
var r = rest;
rest = 0;
var v = arr[i];
if (lastRatio < 1) {
var c = v * lastRatio;
rest = v - c;
v = c;
}
lastRatio -= 1;
lastVal += v + r;
if (lastRatio <= 0) {
results[resIndx++] = lastVal;
lastVal = 0;
lastRatio += sizeRatio;
}
}
return results;
}
这会产生如上所述的确切结果。
关于它是如何工作的:
首先,我们确定原始数组的多少字段相当于所需数组长度(sizeRatio)的一个字段。
然后我们遍历源数组并将值相加,直到达到一个目标字段的目标比率,然后将该值附加到结果中。
如果比率不是 %1 = 0,我们只添加当前值的一部分,其余的保留添加到下一次迭代。=> 这是目标长度不是彼此倍数的重要部分。
我认为代码非常好,因为它不依赖于嵌套 for 循环,并且在源数组的一次迭代之后完成。
但是,如果应该有更好的方法来做到这一点,最好不使用库,请分享它们并让我知道你的想法。