【问题标题】:How to compress/simplify/downscale numeric arrays in javascript如何在javascript中压缩/简化/缩小数字数组
【发布时间】:2019-02-15 15:34:14
【问题描述】:

目前我一直在尝试缩短数值数组,而不会使数据值彼此失去相关性。

首先这里是一个例子:假设一个长度为 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

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

【问题讨论】:

标签: javascript arrays data-conversion


【解决方案1】:

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

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

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

【讨论】:

  • 这应该完成你的问题,而不是回答它。否则没有问题。
  • 好吧,我是来分享我的知识并要求改进的,或者这是不允许的吗? stackoverflow.blog/2011/07/01/…
  • @serge 错误!这是一个答案。答案进入答案部分。 SO 是答案的集合,而不是 Q/A 网站。自我回答是一种常见的做法,也是一件好事
  • @JonasWilms 好的,我有点困惑,这是我的第一篇此类帖子,感谢您清理它:)
  • @ThexBasic 如果您正在寻找反馈,有一个专门的网站可以做到这一点:codereview.stackexchange.com
猜你喜欢
  • 2011-09-05
  • 1970-01-01
  • 2014-03-27
  • 2012-01-29
  • 2011-12-14
  • 1970-01-01
  • 2011-01-21
相关资源
最近更新 更多