嘿,我有一个简单的问题,我找不到答案, 我正在尝试为图表生成一些原始数据
假设我有一个类似的数组:
[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}
但我需要它作为我上面指定的数组?
任何帮助,提前谢谢
答案 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)
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)
答案 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]) );