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

计算数组中每个值在该数组中出现的次数(javascript),javascript,arrays,Javascript,Arrays,我有一个问题,关于如何对数组执行一些数学运算。如果这是一个基本的问题,我很抱歉,javascript不是我最强的语言,在我最好的日子里,我是一个平庸的程序员 我有一个值数组,作为分析的一部分,我正在执行mann-kendall测试,但我在计算方差时遇到了困难。 (第6步) 本质上,我想计算数组中每个值在该数组中出现的次数。 例如,在世界的某个特定像素处,阵列可能看起来像: [1, 1, 0.7, 0.3, 1, 0.8, 1, 0.8, 0.7, 1] 我需要计算特定值出现的次数,然后运行

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

我有一个值数组,作为分析的一部分,我正在执行mann-kendall测试,但我在计算方差时遇到了困难。 (第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  
然后计算这些“关系”的值作为表达式的一部分

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(想想google地图引擎),因此一些更标准的Javascript答案可能不起作用(我已经尝试了其他so线程的一些脚本变体(.)
  • 这些阵列对于地球上的每个像素都是独一无二的,所以我认为 最好的方法是将其作为函数
  • 如上所述,计数为1的值会出现错误,这很好,但是,我需要避免重复计数项,以便简单地进行转换 数组的计数(
    [5,5,2,1,5,2,5,2,5]
    )为 不对
  • 我仅限于使用标准Javascript库
var-arr=[1,1,0.7,0.3,1,0.8,1,0.8,0.7,1];
文件写入(计算(arr));
函数计算(arr){
freq={};
对于(var i=0;i
函数foo(arr){
var a=[],b=[],上一个;
arr.sort();
对于(变量i=0;i”;
}

简而言之,您想创建一个dict(map),其中key value是数组val,map vlue是它们的出现计数,是吗?听起来不错,但是,访问它们似乎是最难的部分。作为更新:我尝试了下面的一些答案。forEach似乎不起作用,系统抛出了一个“nota function”错误。这里的主要问题是,我使用的是beta平台,数组功能与我以前使用数组的经验不符。这可以更习惯地写成
freq[v]=(freq[v]| | 0)+1
一个非常可读的代码,但是.forEach似乎不起作用,系统抛出一个“nota function”错误。是否有一种优雅的方法可以使用它?@JamesColl,我将其替换为for循环。太棒了!但是,我现在得到一个映射了常量“0”的图像。它似乎没有循环通过最后一个for循环并更改sum的值;你知道为什么吗?你的意思是输入数组是[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>");
}