2

我有一些复杂的输入名称,例如: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,它会请求它,而不是:

塔)。该请求将类似于:

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可以正常工作,但像 nad 这样的复杂案例test3[1]将无法理解并且会崩溃。

解决方法

目前,我正在使用一种解决方法来创建一个数组,例如:this][is][][a][complex并且它被 HTTP 请求包含在data[...]什么转向.data[this][is][][a][complex][name]

研究

它类似于如何将输入名称转换为 JavaScript 数组问题,但它有点复杂,因为深度是 0 到无限(通常到 3 级)。所以,除非我使用 eval (!),否则我什么都做不了。

4

1 回答 1

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/

于 2013-04-05T18:42:54.133 回答