我有一些输入字段比我想要的数组大,这样我就可以在页面的表格中查看它们。我已经能够创建使用.serializeArray()用表单数据创建数组对数据进行分组和排序
阵列在this fiddle我已经能够输出我的阵列,但是我想要的数据显示为它在表上确实我在小提琴,它的底部硬编码将每个ID的Tom和Jerry的所有实例分组成一行。确认该ID的所有销售价值等。我想按总销售价格列进行分类。我知道服务器端技术来做到这一点,但在这种情况下,我正在寻找一个jQuery解决方案。实现这一目标的最佳方式是什么?
我有一些输入字段比我想要的数组大,这样我就可以在页面的表格中查看它们。我已经能够创建使用.serializeArray()用表单数据创建数组对数据进行分组和排序
阵列在this fiddle我已经能够输出我的阵列,但是我想要的数据显示为它在表上确实我在小提琴,它的底部硬编码将每个ID的Tom和Jerry的所有实例分组成一行。确认该ID的所有销售价值等。我想按总销售价格列进行分类。我知道服务器端技术来做到这一点,但在这种情况下,我正在寻找一个jQuery解决方案。实现这一目标的最佳方式是什么?
我假设你可以依靠总是出现在四组与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将它们转换为数字。
非常感谢!我没有想到.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
试试这个:http://jsfiddle.net/nnnnnn/VNSam/7/ - NaN是因为我的代码假设所有的字段都是输入元素(我的答案的第一句话就是这么说的),所以用一个select来代替'name =“price []”'输入中的一个,这意味着select被忽略,而'price'数组的值比其他数组少一个代码正在读取数组的末尾。从jQuery选择器中删除'input',并根据他们的名字获取字段,并且问题消失。 – nnnnnn 2012-08-05 06:07:10
2.我的代码假设表已经存在并附加到它的末尾。在更新的小提琴中,我添加了一行'$ results.find(“tr [data-id]”)。remove();'删除之前添加的任何行(您会注意到在我的原始解决方案中,我已经设置了'data-id'属性,所以这是一种方便的方式来选择需要被替换的行。 – nnnnnn 2012-08-05 06:09:03