2012-08-05 77 views
0

我有一些輸入字段比我想要的數組大,這樣我就可以在頁面的表格中查看它們。我已經能夠創建使用.serializeArray()用表單數據創建數組對數據進行分組和排序

陣列在this fiddle我已經能夠輸出我的陣列,但是我想要的數據顯示爲它在表上確實我在小提琴,它的底部硬編碼將每個ID的Tom和Jerry的所有實例分組成一行。確認該ID的所有銷售價值等。我想按總銷售價格列進行分類。我知道服務器端技術來做到這一點,但在這種情況下,我正在尋找一個jQuery解決方案。實現這一目標的最佳方式是什麼?

回答

1

我假設你可以依靠總是出現在四組與id[]name[]sales[] & price[]每個組的隱藏輸入字段,否則(顯然)你不能告訴哪些字段是相關的。因此,我不會使用.serializeArray(),它返回一個包含所有值的單個數組,我會將ID放在它們自己的數組中,這些名稱在它們自己的數組中,等等。也許是這樣的:

function showValues() { 
    function getVal(el, i) { 
     return el.value; 
    } 
    var ids = $.map($('input[name="id[]"]'), getVal), 
     names = $.map($('input[name="name[]"]'), getVal), 
     sales = $.map($('input[name="sales[]"]'), getVal), 
     prices = $.map($('input[name="price[]"]'), getVal), 
     data = {}, 
     i, 
     $results = $("#results"); 

    for (i = 0; i < ids.length; i++) { 
     if (!data[ids[i]]) { 
      // if current id is new add a record for it: 
      data[ids[i]] = { 
       "id":ids[i],"name":names[i],"sales":+sales[i],"price":+prices[i] 
      }; 
     } else { 
      // otherwise add to existing record's totals 
      data[ids[i]].sales += +sales[i]; 
      data[ids[i]].price += +prices[i]; 
     } 
    } 
    // data object now contains the details for each salesman, 
    // so turn it into an array to allow sorting: 
    data = $.map(data, function(val, key) { return val; }); 
    data.sort(function(a,b) { return a.price - b.price; }); 

    // now output table - assume there's already a table element with headings 
    $.each(data, function(i, val) { 
     var $tr = $("<tr></tr>").attr("data-id", val.id).appendTo($results); 
     $("<td></td>").text(val.name).appendTo($tr); 
     $("<td></td>").text(val.sales).appendTo($tr); 
     $("<td></td>").text(val.price).appendTo($tr); 
     $("<td></td>").text(val.price/10).appendTo($tr); 
    }); 
} 

工作演示:http://jsfiddle.net/nnnnnn/VNSam/5/

通過解釋,這條線:

ids = $.map($('input[name="id[]"]'), getVal) 

...說讓所有的投入與name="id[]",並通過所產生的jQuery對象爲$.map() method,這樣我們就可以找回包含id值的數組 - 您可以看到getVal()只是一個簡單的函數,完全可以做到這一點。我爲name[]和其他字段做同樣的事情。

還要注意的是銷售和價格值是從輸入檢索時的字符串,所以我使用的unary plus operator將它們轉換爲數字。

+0

非常感謝!我沒有想到.serializeArray()是要走的路,我不熟悉.map(),所以這是很好的知道。我想排序最高,所以我可以改變這個返回b。價格 - a.price或添加data.reverse(); 。我不明白的一件事是在我的小提琴基於http://jsfiddle.net/aaronk85/VNSam/的初始示例中,您可以更新選擇字段。當我試圖將這個功能構建成你所做的時,我會得到2個錯誤? 1.我得到NAN和2.它再次建立結果而不是更新?你明白爲什麼? http://jsfiddle.net/aaronk85/VNSam/6/ – ak85 2012-08-05 03:52:52

+1

試試這個:http://jsfiddle.net/nnnnnn/VNSam/7/ - NaN是因爲我的代碼假設所有的字段都是輸入元素(我的答案的第一句話就是這麼說的),所以用一個select來代替'name =「price []」'輸入中的一個,這意味着select被忽略,而'price'數組的值比其他數組少一個代碼正在讀取數組的末尾。從jQuery選擇器中刪除'input',並根據他們的名字獲取字段,並且問題消失。 – nnnnnn 2012-08-05 06:07:10

+1

2.我的代碼假設表已經存在並附加到它的末尾。在更新的小提琴中,我添加了一行'$ results.find(「tr [data-id]」)。remove();'刪除之前添加的任何行(您會注意到在我的原始解決方案中,我已經設置了'data-id'屬性,所以這是一種方便的方式來選擇需要被替換的行。 – nnnnnn 2012-08-05 06:09:03