2013-03-30 118 views
0

请帮我计算表中的特定值。jquery按值计算多维数组

我有这种形式的一些数据:

var data = { 
    "metadata": ["FZ", "CS", "CU", "CZ"], 
     "values": [ 
     ["CON", "184.0", "null", "null"], 
     ["ERG SRL", "35.0", "null", "57.0"], 
     ["IO", "6.0", "null", "null"], 
     ["IND", "null", "1753.0", "null"], 
     ["LIXL", "1644.0", "null", "3748.0"], 
     ["MOXRL", "2285.0", "null", "0.0"], 
     ["MOLXL", "11.0", "null", "0.0"], 
     ["MURX", "5362.0", "null", "275.0"], 
     ["STRL", "197.0", "null", "39.0"] 
    ] 
}; 

这里是results on jsbin。 在该表中,我有一些值,如null,0.0等。

所有我想要的是他们的关键指望这个值: 例子: 这是我的表:

 
FZ  CS  CU  CZ 
CON  184.0 null null 
ERG  35.0 null 57.0 
IO  6.0  null null 
IND  null 1753.0 null 
LIXL 1644.0 null 3748.0 
MOXRL 2285.0 null 0.0 
MOLXL 11.0 null 0.0 
MURX 5362.0 null 275.0 
STRL 197.0 null 39.0 

这里是我想要的结果:

 
     CS CU CZ 
all  9 9 9 
null 1 8 3 
0.0  0 0 2 
>0  8 1 4 

唯一的结果是当我在生成的表格中计算单元格时,但如果我想分页,这不太好。

我试过.length(),count++根据stackoverflow.com上的几个答案,但没有结果。

谢谢大家的提示和答案。

+1

没有内建解决方案来做到这一点。您必须创建自己的函数来过滤/计算所有这些属性/值。 –

+0

你能给我一个提示吗?一个起点?我是新来的javascript – DGA

+1

这里没有jQuery ... – RobG

回答

1

下面是一路映射所有的数据通过创建表

HTML的解决方案:

<table id="counter"></table> 

JS:

var tableHeader=['<tr><th></th>']; 
/* final mapped object, structured to make html generation and search of metadata vs category easy*/ 
/* arrays wil contain category count in same array order as metadata*/ 
var catObj = {'all':[], 'null':[], '0.0':[], '&gt;0':[]};/* "&gt;" used intentionally vs ">" due to html entity*/ 
/* create header row and populate count arrays with zeros*/ 
$.each(data.metadata,function(i,item){ 
    tableHeader.push('<th>'+item+'</th>'); 
    $.each(catObj,function(key,arr){ 
     arr[i]=0; 
    });  
}); 

tableHeader.push('</tr>'); 


/* categorize the values and update appropriate counter array*/ 
$.each(data.values,function(i,arr){ 
    $.each(arr, function(idx, val){ 
     catObj[getCategory(val)][idx] ++; 
    }); 
}); 
/* create the table rows from counter arrays*/ 
var rowsHtml=[]; 
$.each(catObj,function(key,arr){ 
    rowsHtml.push('<tr><td>'+key+'</td>'); 
    rowsHtml.push('<td>'+arr.join('</td><td>')+'</td></tr>'); 
}); 
/*insert table html*/ 
$('#counter').html(tableHeader.join('')+rowsHtml.join('')) 


/* helper to do categorizing of each value*/  
function getCategory(value) { 
    if (isNaN(value)) { 
     return value != 'null' ? 'all': 'null'; 
    } else { 
     return value == 0 ? '0.0' : '&gt;0'; 
    } 
} 

DEMO:http://jsfiddle.net/ykuzg/4

EDIT

如果需要可以做一个搜索最终对象的基于元数据的值如下:

function searchCats(meta, category){ 
    return catObj[category][ $.inArray(meta, data.metadata) ]; 
} 

使用率

searchCats('FZ', 'all') // returns 9 
+0

谢谢你的回答。 Vury为我学习如何完成我需要的其他功能提供了一个很好的起点。你给了我更复杂,更好,我可以用在其他表格。谢谢你们俩。我接受这两个答案。我可以投票,因为我没有声望点,但我标记为已接受的答案。 – DGA

2
function countValues(values, column, search) { 
    var total = 0; 

    for(var i = 0; i < values.length; i++) { 
    if(values[i][column] === search) 
     total++; 
    } 

    return total; 
} 

How to use: countValues(data.values, 2, "null") 

在您的例子:

FZ is column 0 

CS is column 1 

CU is column 2 

CZ is column 3 

希望其明确的足够多。

here is a Fiddle

但我会建议使用框架,如AngularJS强调

+0

非常感谢!我花了两天没有运气,你解决了我的问题。 – DGA

+0

+1,可以非常简单地解决问题。 –

+1

很酷,但OP将需要调用该函数12次,并且它只做等价,它不会执行“> 0”比较。 – RobG