按组分组的JS组数组

时间:2014-07-23 19:17:58

标签: javascript jquery

我无法将数组值保存到组中:

我有一个这样的数组:

 ["0", "2", "8", "8", "8", "8", "8", "8", "2", "9", "9", "9", "9", "9", "2", "10", "10", "10", "10", "10", "10", "10", "10", "0", "3", "11", "11",.....]

我需要的是将值分组并保存到这样的对象:

{0 = 1, 2 = 1, 8 = 6, 2 = 1, 9 = 5, 2 = 1, 10 = 9, 0 = 1,...}

我尝试了几种但没有运气

var max = 0;
var group = {};
for (var i = items.length; --i >= 0; ) {
    var value = items[i];
    var n = group[value] = 1 - -(group[value] | 0);
    if (n > max) {
        max = n;
    }
}

这个返回所有求和值,如:{0=6, 2=7,...}

这也给我错误的结果:

var j = 1,
        value = 0,
        valueArray = {};

for (i = 0; i <= items.length; i++) {
    if (value == items[i]) {
        j++;
    } else {
        valueArray[j] = value;
        j = 1;
    }
    value = items[i];
}

有任何建议吗?

4 个答案:

答案 0 :(得分:2)

使用此...

var values = ["0", "2", "8", "8", "8", "8", "8", "8", "2", "9", "9", "9", "9", "9", "2", "10", "10", "10", "10", "10", "10", "10", "10", "0", "3", "11", "11"]

var counts = {};

_.each(values, function(v, i) {

    if (counts[v]) {
        counts[v] ++;
    } else {
        counts[v] = 1;
    }
});

console.log(counts);        

在这里工作... http://jsfiddle.net/B8uy3/

答案 1 :(得分:1)

我认为你在JS中想要实现的是不可能的 - 根据你所写的,你的输出对象会有两个值为0的键(或三个值为2的键)

什么是可能的,确实是分组,但不是根据你提供的输出:

var input = ["0", "2", "8", "8", "8", "8", "8", "8", "2", "9", "9", "9", "9", "9", "2", "10", "10", "10", "10", "10", "10", "10", "10", "0", "3", "11", "11"];

var output = [];
for (var i=0; i<input.length; i++)
{
    if (!output[output.length-1] || output[output.length-1].value != input[i])
        output.push({value: input[i], times: 1})
    else
        output[output.length-1].times++;
}

console.log(output);

小提琴:http://jsfiddle.net/UCbkz/

在输出数组中,您最终会得到输入数组中的数字组,因此:

  • 0 =&gt;值:0,次数:1
  • 1 =&gt;值:2,次:1
  • 2 =&gt;值:8,次数:6
  • 3 =&gt;值:2,次:1
  • ...

答案 2 :(得分:0)

您可以使用:

var arr= ["0", "2", "8", "8", "8", "8", "8", "8", "2", "9", "9", "9", "9", "9", "2", "10", "10", "10", "10", "10", "10", "10", "10", "0", "3", "11", "11"];

var newObj = {}

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

console.log(newObj);

http://jsfiddle.net/3Fe8Q/1/

答案 3 :(得分:0)

基于Trent答案的原生Javascript解决方案:

var values = ["0", "2", "8", "8", "8", "8", "8", "8", "2", "9", "9", "9", "9", "9", "2", "10", "10", "10", "10", "10", "10", "10", "10", "0", "3", "11", "11"]

var counts = {};

values.forEach(function (v) {
    if (counts[v]) counts[v]++;
    else counts[v] = 1;
});