将复杂输入名称转换为数组

时间:2013-04-05 17:55:33

标签: javascript jquery

我有一些复杂的输入名称,如:this[is][][a][complex][name],我需要将其转换为数组/对象。像:

{ "this": { "is": [ { "a": { "complex": { "name": true } } } ] } }

我怎样才能使用纯javascript或jquery?

原因

我需要使用jQuery.ajax()方法发送它,如:

jQuery.ajax({
    "data": {
        "complex": complex_names,
        "time": Date.now()
     }, ...
});

如果我只是序列化this[is][][a][complex][name]=true之类的数据,则会破坏HTTP请求,并将其发送为data[this[is][][a][complex][name]]而不是data[this][is][][a][complex][name]

示例

我做了这个例子来帮助你。好吧,假设我有这个:

<input type="text" name="test1" value="ok" />
<input type="text" name="test2" value="ok" />
<input type="text" name="test3[1]" value="ok" />
<input type="text" name="test4[1][2]" value="ok" />
<input type="text" name="test5[]" value="ok" />

如果我通过POST直接发送,它会生成如下请求:

test1: ok
test2: ok
test3[1]: ok
test4[1][2]: ok
test5[]: ok

但我需要通过jQuery.ajax()方法发送它,在data选项中的数组内部(如complex_data和其他一些数据一样)。请求类似于:

call_time: 1612
call_title: test
complex_data[test1]: ok
complex_data[test2]: ok
complex_data[test3][1]: ok
complex_data[test4][1][2]: ok
complex_data[test5][]: ok

请注意,我的表单输入将在complex_data对象中设置。但是,如果我只是将数据转换为数组,例如:

{
  "test1": "ok",
  "test2": "ok",
  "test3[1]": "ok",
  "test4[1][2]": "ok",
  "test5[]": "ok",
}

然后将其发送给complex_data,它会请求它,而不是:

TA)。请求类似于:

call_time: 1612
call_title: test
complex_data[test1]: ok
complex_data[test2]: ok
complex_data[test3][1]]: ok
complex_data[test4][1][2]]: ok
complex_data[test5][]]: ok

test1 nad test2这样的简化案例可以正常使用,但像test3[1]这样的复杂案例将无法理解并会破坏。

解决方法

目前,我正在使用一种解决方案解决方案来创建类似于this][is][][a][complex的数组,并且HTTP请求将其包含在data[...]内,转而data[ {{ 1}} this][is][][a][complex][name

研究

它与How to convert input name to JavaScript array问题相似,但它有点复杂,因为深度为0到无穷(通常为3级)。所以,除非我使用eval(!),否则我无法做任何事情。

1 个答案:

答案 0 :(得分:2)

有趣的问题,这就是我想出的:

function convert(s) {
    var names = s.replace(/^\w+/, "$&]").replace(/]$/, "").split("][");
    var result = {};
    var obj = result;
    var last;
    for (var i = 0; i < names.length; i++) {
        var name = names[i];
        if (typeof last !== "undefined") {
            obj[last] = name === "" ? [] : {};
            obj = obj[last];
        }
        last = name === "" ? 0 : name;
    }
    obj[last] = true;
    return result;
}

JSFiddle:http://jsfiddle.net/QdRvz/