计算数组中每个值出现在该数组中的次数(javascript)

时间:2014-12-01 08:39:43

标签: javascript arrays

我有一个关于如何在数组上执行某些数学运算的问题。如果这是一个基本问题,我很抱歉,javascript不是我最强的语言,而且在我最好的日子里,我是一个平庸的程序员。

我有一系列的数值,作为分析的一部分,我正在进行mann-kendall测试,但是我已经碰到了计算方差的墙。 (http://vsp.pnnl.gov/help/Vsample/Design_Trend_Mann_Kendall.htm步骤#6)

基本上,我想计算数组中每个值出现在该数组中的次数。 因此,例如在世界的特定像素处,阵列可能看起来像:

[1, 1, 0.7, 0.3, 1, 0.8, 1, 0.8, 0.7, 1]  

我需要计算特定值出现的次数,然后运行表达式
    表达式(值*(值-1)*(值* 2 + 5));

所以对于那个数组,我想要明确的值计数......

1: 5  
0.7: 2  
0.8: 2  
0.3: 1  

然后计算那些" tie"的价值。作为表达的一部分......

5 * (5-1) * (5*2 -5) +   
2 * (2-1) * (2*2 -5) +   
2 * (2-1) * (2*2 -5) +   
1 * (1-1) * (1*2 -5)  

一些注意事项:

  • 这是地图的Javascript(想想谷歌地图引擎),所以一些更标准的Javascript答案可能无效(我已经尝试过其他SO线程(Counting occurences of Javascript array elements)的一些脚本变体。)
  • 这些阵列对于整个星球上的每个像素都是独一无二的,所以我想 最好的方法是作为一种功能。
  • 如上所示,计数值为1的数值会下降,这很好,但是,我需要避免重复计算项目,以便简单地转换 数组到计数([5, 5, 2, 1, 5, 2, 5, 2, 2, 5])是 不正确。
  • 我仅限于标准的Javascript库。

2 个答案:

答案 0 :(得分:1)



var arr = [1, 1, 0.7, 0.3, 1, 0.8, 1, 0.8, 0.7, 1];
document.write(compute(arr));
 
function compute(arr){
    freq = {};
    for(var i=0; i<arr.length; i++){
        freq[arr[i]] = (freq[arr[i]] || 0) + 1;
    }
    
    var sum = 0;
    for(var i in freq){
        sum += freq[i]*(freq[i]-1)*(freq[i]*2-5);
    }
    return sum;
}
&#13;
&#13;
&#13;

答案 1 :(得分:0)

function foo(arr) {
    var a = [], b = [], prev;
    arr.sort();
    for( var i = 0; i < arr.length; i++ ){
        if ( arr[i] !== prev ) {
            a.push(arr[i]);
            b.push(1);
        } else {
            b[b.length-1]++;
        }
        prev = arr[i];
    }
    return [a, b];
}

var arr = [1, 1, 0.7, 0.3, 1, 0.8, 1, 0.8, 0.7, 1];
var result = foo(arr);
// result[0] contain unique array elements and result[1] contain number of occurrences of those elements
for(var i = 0; i < result[0].length; i++){
    document.write(result[0][i] + " : " + result[1][i] + "<br>");
}