Php 需要将带方括号的字段名转换为javascript对象

Php 需要将带方括号的字段名转换为javascript对象,php,javascript,arrays,forms,input,Php,Javascript,Arrays,Forms,Input,我想将包含方括号的字段名转换为JavaScript中的对象。我已经看到PHP将它们转换成数组,但尽管已经搜索了好几天,但还没有看到JavaScript将它们转换成数组 数据: 未经测试,但您的基本算法可能是这样的: 以下是我的作品: var form = {}; $(':input', yourFormElement).each(function(){ var top = form; var path = $(this).attr('name'); var val = $(this)

我想将包含方括号的字段名转换为JavaScript中的对象。我已经看到PHP将它们转换成数组,但尽管已经搜索了好几天,但还没有看到JavaScript将它们转换成数组

数据:

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

以下是我的作品:

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
,以获得所需的表单元素

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

it工作示例:


while循环中的一系列条件可以简化很多,但它可以工作。

修复了终止和解析错误。一个小问题!表单对象需要像树一样
form->permanent->(name)/(street->(street\u one/street\u two))
甚至与您的问题不匹配,
->
对于对象取消引用来说是无效的JavaScript(您可能想到的是PHP或Perl)。根据您的问题,结构如下:
form.address.permanent.name
i使用->作为表示。非常抱歉。是的,它必须像form.address.permanent.name一样,我想把street归为permanent。以及街道一号和街道二号,都属于街道物体。下面是您的代码,看看JSFIDLE。它完全按照您的规格工作。
form = { address: { permanent: { name: "My Address", street: { street_one: "My Street One", street_two: "My Street Two" } } } }
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));
});