id[]
非表示の入力フィールドは常に, name[]
, sales[]
&でグループごとに 4 つのグループで表示されることに頼ることができると思います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()
メソッドに渡して、id 値だけを含む配列を取得できるようにgetVal()
します。まさにそれを行う単純な関数であることがわかります。name[]
および他のフィールドについても同じことを行います。
また、入力から取得したときの sales 値と price 値は文字列であるため、単項プラス演算子を使用して数値に変換していることにも注意してください。