javascript - 如何将 <input> "names"存储为对象的属性,然后将匹配的 <input> "value"存储为该对象属性的值?

标签 javascript jquery

我希望动态地构建一个对象,其中属性是输入名称,该属性的值将是输入值。

这是 HTML

<form>
                <fieldset>
                    <legend>form</legend>
                    <label>First<input type="text" value="null" name="first"/></label>
                    <label>Last<input type="text" value="null" name="last"/></label>
                    <label>Email<input type="text" value="null" name="email"/></label>

                    <input type="submit" value="submit"/>
                </fieldset>
            </form>

这是我目前使用的 jQuery。
我已将值和名称存储在单独的数组中。有没有一种方法可以创建某种关联数组或创建一个对象,其中属性名称取自一个数组,值取自另一个数组?

        var values = new Array();
    var names = new Array();

    $("form").submit(function(event){
        event.preventDefault();

            values = [];
            names = [];

            $('form input').not('[type="submit"]').each(function(){
            values.push($(this).val());

            });


            $('form input').not('[type="submit"]').each(function(){
            names.push($(this).attr("name"));

            });

    });

我还尝试了 .serializeArray(),它返回一个对象数组。但后来我不知道如何将所有键/值对从该对象中取出并放入一个新对象中。

最终目标是不通过 ajax 发送这些数据,而是发送给聚合数据进行分析的第三方。请帮忙。我自学成才,完全迷失了。哈哈。谢谢

附注

我试过了

$( "form" ).on( "submit", function( event ) {
            event.preventDefault();
            var input = $("form").serializeArray();
            $.each(input, function(i, field){
                console.log(JSON.stringify(input[i]));
            });
        });

但它返回这个

{"name":"first","value":"null"}
{"name":"last","value":"null"}
{"name":"email","value":"null"}

这似乎同样没有帮助。哈哈。

我希望能够得到这样的结果

{
  "first" : "null",
  "last" : "null",
  "email" : "null"
}

最佳答案

我能想到的最简单的方法是使用 serializeArray 然后reduce到一个对象或 map 。例如

$('form').on('submit', e => {
    e.preventDefault();

    let values = $(this).serializeArray().reduce((map, input) => {
        let value;
        if (map.hasOwnProperty(input.name)) {
            value = Array.isArray(map[input.name]) ?
                map[input.name] : [map[input.name]];
            value.push(input.value);
        } else {
            value = input.value;
        }
        map[input.name] = value;
        return map;
    }, {});
})

这处理 <select multiple><input type="checkbox">通过将命名值设置为数组来元素。

JSFiddle 演示在这里 ~ https://jsfiddle.net/wmjeh5Lv/1/


旧版本

$('form').on('submit', function(e) {
    e.preventDefault();

    var values = $(this).serializeArray().reduce(function(map, input) {
        var value;
        if (map.hasOwnProperty(input.name)) {
            value = Array.isArray(map[input.name]) ?
                map[input.name] : [map[input.name]];
            value.push(input.value);
        } else {
            value = input.value;
        }
        map[input.name] = value;
        return map;
    }, {});
})

关于javascript - 如何将 &lt;input&gt; "names"存储为对象的属性,然后将匹配的 &lt;input&gt; "value"存储为该对象属性的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37288755/

相关文章:

javascript - js正则表达式替换多个反向引用

javascript - 在 onclick 函数后需要帮助将 div 移动到另一个 div

javascript - 当元素不再出现在屏幕上时?

Javascript/jQuery 将toggleClass 限制为4

javascript - Backbone .fetch() 未使用最新数据更新集合

javascript - Jquery .show() 并显示 :inline

javascript - 正则表达式 javascript 数字和字母

javascript - 如何在 onclick 中针对特定值进行 react

Javascript:到目前为止的字符串失败

javascript - 有没有更聪明的方法来替换这个 CSS 列 JS?