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

3

我有一个包含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和/或underscore。


参见https://dev59.com/_G035IYBdhLWcg3wBLTb - georg
4个回答

8

易如反掌!您输入的值成为输出的键;当您遇到这些值时,您会在这些键上进行累积:

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]

在线演示


接近了,但不是完全正确的。数组的成员必须初始化为数字(最好是零)。你得到的结果是[,NaN,NaN,NaN,NaN,NaN] - RobG
@RobG:我试过了。但是,不,它没有。你有点击标记为“演示”的链接吗?或者甚至阅读代码了吗? - Lightness Races in Orbit
不,我将您最初发布的代码粘贴到浏览器中。您已更改它以使其正常工作。 - RobG
非常好...我没有提到,但初始数组中也可能有一个字符串。 - Björn
16分钟?我只看到大约5分钟的差别,这给了你足够的时间来编辑你的答案,而不会显示为已编辑。一定是勉强及时完成的。 :-) - RobG
显示剩余3条评论

5
听起来这似乎是一个“reduce”的工作。
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;

他的代码明确指出他需要一个数组,而不是普通对象。 - Lightness Races in Orbit
@LightnessRacesinOrbit——这可能是为什么首先给出了一个数组答案,但建议使用对象作为更合适的选项。 - RobG
@RobG:这是作为逻辑推断(“所以”)的一部分给出的,前提是“您的arr2实际上是关联的”,当明确要求它不再是时,这显得毫无意义。不过,显然问题已经改变了。 - Lightness Races in Orbit

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)

使用||代替三元运算符会更易读:arr2[n] = (arr2[n] || 0) + 1 - georg
对于一些人来说,无论哪种方式都可以。不过需要打得更多一些。 :-) - RobG

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
)

使用哪个 JavaScript PHP 实时解释器? - Martin Hennings
恭喜您完全没有费心阅读问题。 - Lightness Races in Orbit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接