我有一系列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]
Run Code Online (Sandbox Code Playgroud)
如你所见,在这种情况下,数组只有i个不同的值(v) (0,1,2),i = 3
我想要的是最终得到像这样的阵列.
var arr2 = [23, 45, 64]
Run Code Online (Sandbox Code Playgroud)
arr2数组的长度应该对应于i,值应该是每个值的出现次数(v)
我正在做各种循环和条件,但寻找一个直接的解决方案.到目前为止我的部分http://jsfiddle.net/fiddlebjoern/aSsjy/2/
可能涉及jQuery和/或下划线.
十分简单!输入值成为输出的键; 当您遇到值时,您会累积在这些键上:
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]
Run Code Online (Sandbox Code Playgroud)
听起来像是"减少"的工作
arr2 = arr1.reduce(function(a, v) {
a[v] = (a[v] || 0) + 1;
return a;
}, [])
Run Code Online (Sandbox Code Playgroud)
此外,您arr2实际上是关联的,因此最好使用对象:
map = arr1.reduce(function(a, v) {
a[v] = (a[v] || 0) + 1;
return a;
}, {})
Run Code Online (Sandbox Code Playgroud)
reduce是Javascript 1.8,对于旧版浏览器,您需要仿真或使用像underscore.js这样的库.
使用underscore.js的示例:
arr2 = _(arr1).chain().groupBy(_.identity).map(_.size).value()
Run Code Online (Sandbox Code Playgroud)
这可能不像其他答案那么"简单",但至少你可以从中学到一些东西.
为了完成,这是使用普通循环执行相同任务的正确方法:
counter = [] // or {}
for (var i = 0; i < arr.length; i++)
counter[arr[i]] = (counter[arr[i]] || 0) + 1;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
377 次 |
| 最近记录: |