将数组转换为新数组(计算出现次数)

时间:2012-03-08 11:27:36

标签: javascript arrays

我有一系列 n 项目数

var arr1 = [2, 0, 0, 1, 1, 2, 0, 0, 0, 2, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 2, 2, 0, 0, 2, 2, 1, 2, 2, 0, 1, 2, 2, 1, 1, 0, 1, 1, 0, 2, 1, 0, 0, 0, 2, 1, 1, 1, 2, 2, 1, 0, 0, 0, 2, 2, 2, 2, 2, 1, 0, 2, 2, 0, 2, 2, 0, 2, 0, 0, 1, 2, 1, 0, 2, 1, 0, 1, 2, 0, 2, 0, 0, 0, 1, 2, 1, 0, 2, 0, 0, 0, 1, 2, 1, 1, 1, 1]

如您所见,在这种情况下,数组只有 i 不同的值(v) (0,1,2),i = 3

我想要的是最终得到像这样的阵列。

var arr2 = [23, 45, 64]

arr2数组的长度应该对应 i ,值应该是每个值(v)

的出现次数

我正在做各种循环和条件,但寻找一个直接的解决方案。 到目前为止我的部分http://jsfiddle.net/fiddlebjoern/aSsjy/2/

可能涉及jQuery和/或下划线。

4 个答案:

答案 0 :(得分:9)

轻松自在!输入值成为输出的键;当您遇到值时,您会在这些键上累积:

var arr1 = [0,0,0,1,2,3,4,3,2,3,4,3,4,3,5];
var arr2 = [];

for (var i = 0; i < arr1.length; i++) {
   var n = arr1[i];
   if (arr2[n] != undefined)
       arr2[n]++;
   else
       arr2[n] = 1;
}

console.log(arr2);  // Output: [3, 1, 2, 5, 3, 1]

Live demo

答案 1 :(得分:5)

听起来像是“减少”的工作

arr2 = arr1.reduce(function(a, v) {
    a[v] = (a[v] || 0) + 1;
    return a;
}, [])

此外,您的arr2实际上是关联的,因此最好使用对象:

map = arr1.reduce(function(a, v) {
    a[v] = (a[v] || 0) + 1;
    return a;
}, {})

reduce是Javascript 1.8,对于旧版浏览器,您需要进行仿真或使用像underscore.js这样的库。

使用underscore.js的示例:

arr2 = _(arr1).chain().groupBy(_.identity).map(_.size).value()

这可能不像其他答案那么“简单”,但至少你可以从中学到一些东西。

为了完成,这是使用普通循环执行相同任务的正确方法:

counter = [] // or {}
for (var i = 0; i < arr.length; i++)
     counter[arr[i]] = (counter[arr[i]] || 0) + 1;

答案 2 :(得分:2)

基于另一个答案,这是一个有效的方法:

var arr1 = [1,2,3,4,3,2,3,4,3,4,3,5];
var arr2 = [];
var n, m;

for (var i=0, iLen=arr1.length; i < iLen; i++) {
  n = arr1[i];
  m = arr2[n];
  arr2[n] = m? ++m : 1;
}

alert(arr2)

答案 3 :(得分:1)

您可以使用array_count_values:

<?php
     $array = array(1, "hello", 1, "world", "hello");
     print_r(array_count_values($array));
?>

输出结果为:

Array
(
    [1] => 2
    [hello] => 2
    [world] => 1
)