2013-03-30 161 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