2012-06-05 189 views
0

我有表如下:總和關聯數組鍵值和組它通過關鍵

<table> 
    <thead> 
     <th>PRODUCT</th> 
     <th>QUANTITY</th> 
     <th>AREA</th> 
     <th>PRICE</th> 
     <th>TOTAL</th> 
    <tr> 
     <td id="name">SWEETS</td> 
     <td id="qty">10</td> 
     <td id="area">250</td> 
     <td id="price">16.50</td> 
     <td id="total">160.50</td> 
    </tr> 
    <tr> 
     <td id="name"">DRY FOODS</td> 
     <td id="qty">5</td> 
     <td id="area">100</td> 
     <td id="price">10.25</td> 
     <td id="total">51.25</td> 
    </tr> 
    <tr> 
     <td id="name">FRESH</td> 
     <td id="qty">20</td> 
     <td id="area">250</td> 
     <td id="price">5</td> 
     <td id="total">100</td> 
    </tr> 
    <tr> 
     <td id="name">MEAT</td> 
     <td id="qty">10</td> 
     <td id="area">250</td> 
     <td id="price">15</td> 
     <td id="total">150</td> 
    </tr> 
    <tr> 
     <td id="name">FROZEN</td> 
     <td id="qty">20</td> 
     <td id="area">300</td> 
     <td id="price">10</td> 
     <td id="total">200</td> 
    </tr> 
</table> 

所以,我想做出這樣{area:total}基於區域和麪積總和值然後分組數組值的數組。

像:
面積250:410.5
面積100:51.25
面積300:200

我試圖爲遵循我明白了數組,但我不知道如何我可以將區域分組(我使用setInterval函數,因爲員工可以刪除或更改面積值)

  setInterval(function() { 
      var $row = $(this).closest("tr"); 
      var sasData = []; 
      $row.each(function(i) { 
       var sasValue = parseFloat($row.find("#area").val()); 
       var totValue = parseFloat($row.find("#total").val()); 
       sasData.push({sas:sasValue, tot:totValue}); 
       console.log(sasData); 
      }); 

      function compressedArray(original) { 
       var compressed = []; 
      }; 
     }, 1500) 

請問我可以怎樣處理這個問題?

+0

您忘記關閉您的'' -tag –

+1

ID應該是唯一的 –

+1

@ StefanFandler - [thead]的結束標記(http://www.w3.org/TR/html4/struct/tables.html#edef-THEAD)是可選的。但標記是無效的,因爲它只能有tr作爲子元素。 – RobG

回答

2

此的jsfiddle應該解決您的問題。我也修正了自己的失蹤THEAD,您在乾貨 TD雙引號,並改變ID的上課:

http://jsfiddle.net/Q9nrf/1/

var areas = {}; 
$("tr").each(function() { 
    var area = $(this).find("td.area").text(); 
    if (area != "") { 
     var total = parseFloat($(this).find("td.total").text()); 
     if (!areas.hasOwnProperty(area)) { 
      areas[area] = 0;    
     } 
     areas[area] += total; 
    } 
}); 
console.log(areas); 
+0

你是男人,非常感謝你! –

+0

我還有一個問題,如果我們在頁面中有多個表,我們如何通過'$(「tr」)'函數傳遞這個表? –

+0

你可以簡單地做的是給表一個類(或一個ID),並使用選擇器'$(「#mytable tr」)'。這裏有一個JSFiddle來演示:http://jsfiddle.net/Q9nrf/5/ – h2ooooooo

1

您需要將id值更改爲其他屬性,比如說class。

循環遍歷行(使用tbody元素跳過標題)並從元素中收集具有您之後類的元素的值。您將需要使用數組來存儲它們,因爲您無法對對象的屬性進行排序,並且每個屬性都必須具有唯一的名稱。

1

id應該是唯一。所以更改<td id="area">250</td><td class="area">250</td>

然後只要致電:

o = {}; 
$("td.area").each(function(){ 
key = o[$(this).text()]; 
if (!key) key = 0; 
key += parseFloat($(this).closest("tr").find(".total").text()); 
}); 

那麼你有對象包含鍵值[鍵=區號,值=總]

+0

糾錯:理想情況下,Ids應該是唯一的,但他們不需要。這從現代瀏覽器的寬恕中顯而易見。像$ el.find(「#someid」)_do_這樣的作用域查詢工作,即使這些ID不是唯一的。 –

+0

好的解決方案,但請將'$(this).text()'的結果存儲在局部變量中。 –

+0

請記住使用'parseFloat'而不是'parseInt',因爲OP有浮動數字。 – h2ooooooo