我有一个关于如何在数组上执行某些数学运算的问题。如果这是一个基本问题,我很抱歉,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)
一些注意事项:
[5, 5, 2, 1, 5, 2, 5, 2, 2, 5]
)是
不正确。答案 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;
答案 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>");
}