2013-04-05 56 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