2012-08-05 76 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