3

我想将由方括号组成的字段名称转换为 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" } } } }
4

1 回答 1

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 循环中的这一系列条件可以简化很多,但它确实有效。

于 2013-08-16T06:44:42.977 回答