首页 > 解决方案 > 如何在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

我试图在很多不同的搜索词下找到它,但找不到任何我想要做的示例代码。

标签: javascriptarraysdata-conversion

解决方案


为了实现这一点,可变数组长度和“目标”长度不一定是彼此的倍数,我想出了以下代码:

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 循环,并且在源数组的一次迭代之后完成。

但是,如果应该有更好的方法来做到这一点,最好不使用库,请分享它们并让我知道你的想法。


推荐阅读