Javascript 循环遍历一组HTML表单元素以获取对象中的当前值

Javascript 循环遍历一组HTML表单元素以获取对象中的当前值,javascript,jquery,html,backbone.js,underscore.js,Javascript,Jquery,Html,Backbone.js,Underscore.js,从如下所示的HTML设置中获取: <nav data-filters class=""> <input type="radio" name="type" value="company" checked>Company <input type="radio" name="type" value="product">Product <input type="radio" name="type" valu

从如下所示的HTML设置中获取:

   <nav data-filters class="">

        <input type="radio" name="type" value="company" checked>Company
        <input type="radio" name="type" value="product">Product
        <input type="radio" name="type" value="service">Service

        <select name="category_1" multiple>
            <option value="a" selected>a</option>
            <option value="b">b</option>
            <option value="c" selected>c</option>
        </select>

        <select name="category_2" multiple>
            <option value="a" selected>a</option>
            <option value="b" selected>b</option>
            <option value="c">c</option>
        </select>

        <input type="radio" name="startswith" value="a" checked>a
        <input type="radio" name="startswith" value="b">b
        <input type="radio" name="startswith" value="c">c
        <input type="radio" name="startswith" value="num">#

        <input name="keyword" type="text">

    </nav>
这是我当前的设置(注意:这。$el只是指$(nav)):

这似乎容易出错,我认为这不是最好的方法。 我该怎么做呢

关于此问题背景的注释:
我正在用主干网建立一个小目录。这发生在
过滤器
视图中,其中当前条件被转换为对象,该对象将作为fetch()函数的数据传递给集合。

您可以使用
$.serializeArray
方法()将表单序列化为名称和值的数组。然后,您只需将结果转换为所需的形式:

var inputs = $('nav :input').serializeArray();
var obj = {};
_.each(inputs, function(val){
  if(obj[val.name]){
     obj[val.name].values.push(val.value);
  }else{
    obj[val.name] = {values: [val.value]};
  }
});

JSBin演示:

您不需要
,而且
可能是更大的
的一部分,因此结构可能不实用。您可以这样说:
$('nav:input')。serializeArray()
不过:您是对的,谢谢您指出这一点。我已经相应地更新了我的答案。如果您不想预先声明
obj
,也可以
var obj=(输入)。reduce(函数(h,val){…},{})
serializeArray
是最主要的一点,
\每个
\相比,reduce
并不十分重要。
        var obj = {};

        this.$el.find('[name]').each(function(i, input) {

                var val     = (function() {
                                if ( input.type == "radio" || input.type == "checkbox" )
                                    return $(input).filter(':checked').val();

                                return $(input).val()
                                })(),
                    name    = input.name;

                if (val) {
                    obj[name] = {
                        values: _.flatten([val]) // Always return an array
                    }
                }
            });

        return obj;
var inputs = $('nav :input').serializeArray();
var obj = {};
_.each(inputs, function(val){
  if(obj[val.name]){
     obj[val.name].values.push(val.value);
  }else{
    obj[val.name] = {values: [val.value]};
  }
});