来自count数组的javascript / jquery构建数组

时间:2013-12-16 09:27:02

标签: javascript jquery arrays count

嘿,我有一个简单的问题,我找不到答案, 我正在尝试为图表生成一些原始数据

假设我有一个类似的数组:

[1,0,0,1,2,0]

有没有办法从它中创建一个具有嵌套数组的数组,这些数组代表重复的部分计数?

[[0,3],[1,2],[2,1]]

这里有一些代码可以解决问题,但将计数保存为对象

var array = [1,0,0,1,2,0];
var length = array.length;
var objectCounter = {};

for (i = 0; i < length; i++) {

    var currentMemboerOfArrayKey = JSON.stringify(array[i]);

    var currentMemboerOfArrayValue = array[i];

    if (objectCounter[currentMemboerOfArrayKey] === undefined){

         objectCounter[currentMemboerOfArrayKey] = 1;
    }else{
        objectCounter[currentMemboerOfArrayKey]++;
    }
}

但是objectCounter会像

一样返回它们
{0:3,1:2,2:1}

但我需要它作为我上面指定的数组?

任何帮助,提前谢谢

6 个答案:

答案 0 :(得分:3)

尝试

var array = [1, 0, 0, 1, 2, 0];

function counter(array) {
    var counter = [],
        map = {}, length = array.length;
    $.each(array, function (i, val) {
        var arr = map[val];
        if (!arr) {
            map[val] = arr = [val, 0];
            counter.push(arr);
        }
        arr[1] += 1;
    })

    return counter;
}
console.log(JSON.stringify(counter(array)))

演示:Fiddle

答案 1 :(得分:2)

您可以轻松地将对象转换为数组:

var obj = {0:3,1:2,2:1};

var arr = [];
for (var key in obj) {
  // optional check against Object.prototype changes
  if (obj.hasOwnProperty(key)) {
    arr.push([+key, obj[key]]);
  }
}

注意:对象键是字符串,所以当放入数组时我将它们转换回数字。

答案 2 :(得分:2)

使用Array.reduceArray.map

执行此操作的功能方式
var data = [1,0,0,1,2,0];

var result = data.reduce(function(counts, current) {
    counts[current] = current in counts ? counts[current] + 1: 1;
    return counts;
}, {});

result = Object.keys(result).map(function(current){
    return [parseInt(current), result[current]];
});
console.log(result);

<强>输出

[ [ 0, 3 ], [ 1, 2 ], [ 2, 1 ] ]

答案 3 :(得分:1)

尝试:

var data = [1,0,0,1,2,0];
var len = data.length;
var ndata = [];
for(var i=0;i<len;i++){
    var count = 0;
    for(var j=i+1;j<len;j++){
        if(data[i] == data[i]){
            count ++;
        }
    }
    var a = [];
    a.push(data[i]);
    a.push(count);
    ndata.push(a);   
}
console.log(ndata)

DEMO here.

答案 4 :(得分:1)

首先,您需要将数组映射到关联对象

var arr = [1,0,0,1,2,0];
var obj = {};
for (var i = 0; i < arr.length; i++) {
  if (obj[arr[i]] == undefined) {
    obj[arr[i]] = 0;
  }
  obj[arr[i]] += 1;
}

然后您可以轻松地将该对象转换为2d矩阵,如下所示:

arr = [];
for (var k in obj) {
  arr.push([k, obj[k]]);
}

alert(JSON.stringify(arr));

答案 5 :(得分:1)

现有对象可以转换为带有简单for..in循环的数组。此外,您可以简化生成该对象的现有代码。将两个部分封装在一个函数中,你会得到这样的结果:

function countArrayValues(array) {
  var counter = {},
      result = [];

  for (var i = 0, len = array.length; i < len; i++)
    if (array[i] in counter)
      counter[array[i]]++;
    else
      counter[array[i]] = 1;

  for (i in counter)
    result.push([+i, counter[i]]);

  return result;
}

console.log( countArrayValues([1,0,0,1,2,0]) );

演示:http://jsfiddle.net/hxRz2/