是否有一个JavaScript库或方法将一个大小的数组映射到一个新大小的数组?

时间:2011-07-14 14:05:55

标签: javascript arrays

我正在使用数据数组(计数)绘制直方图,并使用数组来表示直方图。我想放大数据,以便直方图中的点数通常少于我拥有的数据点。

我需要将数据数组映射到直方图数组,这样当直方图正好是数据长度的一半时,每个点就是两个数据点的总和,当它是1.5倍时,每个直方图点就是总和一个数据点加上下一个数值的一半。等

E.g

Data |2|3|1|2|2|3|4|1|
Hist | 5 | 3 | 5 | 5 |

Data | 2| 3| 1| 2| 2| 3| 4| 1|
Hist | 3.5|2.5| 3 |  4 | 4.5 |    

这似乎是一个常见的问题(特别是对于缩放图像),但我还没有找到一个库或函数来完成它。 JavaScript之类的东西是否存在?

1 个答案:

答案 0 :(得分:1)

这似乎是一个非常简单的算法:

function get_hist(data, factor) {
    var hist = new Array();

    for(i=0; i<data.length; i+=factor) {
        el = get_hist_elem(data, i, factor);
        if(!isNaN(el))
            hist.push(el);
    }

    alert(hist.join(", "));
    return hist;
}

function get_hist_elem(data, start_pos, factor) {
    var int_start = (Math.floor(start_pos) == start_pos ? start_pos : Math.floor(start_pos) + 1);
    if(int_start > data.length)
        return NaN;
    var part_start = int_start - start_pos;

    var end_pos = start_pos + factor;
    var int_end = (Math.floor(end_pos) == end_pos ? end_pos : Math.floor(end_pos));
    var part_end = end_pos - int_end;

    var val = 0;
    for(j=int_start; j<int_end; j++)
        val += data[j];
    if(part_start > 0)
        val += data[int_start - 1] * part_start;
    if(part_end > 0)
        val += data[int_end] * part_end;

    return val;
}

并称之为:

var data = [2, 3, 1, 2, 2, 3, 4, 1];
var factor = 1.5;
var hist = get_hist(data, factor);

我创建了一个jsfiddle供你玩:http://jsfiddle.net/3RVKr/