2013-04-05 34 views
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,它会要求它,而不是:

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河畔test2将正常工作,但复杂的情况下,像test3[1]将不被理解和意志爆发。

替代方法

目前我使用的是像创建一个数组的解决方法解决方案:this][is][][a][complex,它是由HTTP请求纳入data[...]什么转data[this][is][][a][complex][name]

研究

它类似于How to convert input name to JavaScript array的问题,但它是一个有点复杂,因为深度为0到无穷大(一般到3级)。所以,除非使用eval(!),否则我无法做任何事情。

+1

什么是你的决定是否'[]'或'{}'应该使用什么逻辑?你似乎在你的例子中混合它们,但我不明白为什么使用它。 **编辑:**没关系,我想我现在正在实现它... – Ian 2013-04-05 18:01:27

+0

你不能只使用序列化方法? – dfsq 2013-04-05 18:04:51

+0

如果我直接将它发送到AJAX'data'选项,Serialize方法会生成一个好结果。但是如果我需要将它发送给一个数组并将其发送给AJAX,它就会被破坏(就像** reason **主题一样)。我会尽力改进这个例子。 – 2013-04-05 18:15:32

回答

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/

+0

它不适用于我的情况。它只会考虑1个复杂的名称并将其设置为true,我需要将其应用于来自表单的序列化字符串。但是,谢谢。 :) – 2013-04-05 19:02:59

+0

嗯,你的问题有点令人困惑,看来这正是你在第一句话中所要求的。 – 2013-04-05 19:04:52