【问题标题】:need to convert field name with square brackets into a javascript object需要将带方括号的字段名称转换为 javascript 对象
【发布时间】:2013-08-18 12:01:21
【问题描述】:

我想将由方括号组成的字段名称转换为 JavaScript 中的对象。我已经看到 PHP 确实将它们转换为一个数组,但是尽管搜索了几天,但还没有看到用 JavaScript 完成。

数据:

<input name="address[permanent][name]" type="text" value="My Address">
<input name="address[permanent][street][street_one]" type="text" value="My Street One">
<input name="address[permanent][street][street_two]" type="text" value="My Street Two">

结果(我想要达到的):

form = { address: { permanent: { name: "My Address", street: { street_one: "My Street One", street_two: "My Street Two" } } } }

【问题讨论】:

    标签: php javascript arrays forms input


    【解决方案1】:

    未经测试,但您的基本算法可能是这样的:

    以下对我有用:

    var form = {};
    $(':input', yourFormElement).each(function(){
      var top = form;
      var path = $(this).attr('name');
      var val = $(this).val();
      var prev = '';
      while ((path.replace(/^(\[?\w+\]?)(.*)$/, function(_m, _part, _rest) {
        prev = path;
        _part = _part.replace(/[^A-Za-z_]/g, '');
        if (!top.hasOwnProperty(_part)) {
          if (/\w+/.test(_rest)) { 
            top[_part] = {}; 
            top = top[_part];
          } else {
            top[_part] = val; 
          }
        } else if (!/\w+/.test(_rest)) {
          top[_part] = val;
        } else {
          top = top[_part];
        }
        path = _rest;
      })) && (prev !== path));
    });
    

    用 jQuery 表达式替换 yourFormElement 以获得所需的表单元素。

    遍历每个 :input 元素(表单输入),然后为每个循环尝试使用正则表达式分解名称的“路径”,同时创建和/或遍历 form 数据- 正在建立的结构。最后将输入的值赋给已经遍历到的叶子节点。

    工作示例:http://jsfiddle.net/8fpLx/10/

    while 循环中的这一系列条件可以简化很多,但它确实有效。

    【讨论】:

    • 修复了终止和解析错误。
    • 一个小问题!表单对象需要像一棵树。 form-&gt;permanent-&gt;(name)/(street-&gt;(street_one/street_two))
    • 这甚至与您的问题不匹配,-&gt; 不是用于对象取消引用的有效 JavaScript(您可能正在考虑 PHP 或 Perl)。根据您的问题的结构是例如:form.address.permanent.name
    • 我使用 -> 只是作为一种表示。非常抱歉。是的,它必须像 form.address.permanent.name 一样,我希望 street 成为永久的。以及街道一和街道二来到街道对象之下。这是你的代码jsfiddle.net/musaid/Fg3mU
    • 看看jsfiddle。它完全按照您的规范工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多