2011-08-26 14 views
5

Hãy nói rằng tôi có điều này:Làm thế nào để phân tích đầu vào [] giá trị và đặt chúng vào một mảng JavaScript

<form id='foo'> 
<input name='bar[name]' /> 
<input name='bar[age]' /> 
</form> 

Làm thế nào tôi có thể nhận được các giá trị của đầu vào mảng trong biểu mẫu foo và đặt chúng vào một mảng kết hợp/đối tượng như thế này:

var result = {bar:{name:'blah',age:21}}; 

PS Tôi không muốn sử dụng bất kỳ khung công tác nào cho việc này.

+3

Bằng "JavaScript thuần túy", tôi hiểu ý bạn là "Không sử dụng JavaScript được viết bởi những người khác, chẳng hạn như nhóm jQuery hoặc YUI"? (Trái ngược với "Không có Flash" hoặc "Không có DOM")? – Quentin

+2

Về mặt kỹ thuật, jQuery *** là *** "JavaScript thuần túy". Bạn có muốn hiểu cách đọc [các phần tử biểu mẫu có DOM thuần túy] hay không (https://developer.mozilla.org/en/DOM/HTMLFormElement) hoặc bạn muốn làm việc hiệu quả hơn và Get Stuff Done? –

+0

là 'querySelectorAll' cũng thuần túy? – pimvdb

Trả lời

2

Điều này sẽ giúp bạn có được các yếu tố:

var result = {}; 
    var elements = document.forms.foo.getElementsByTagName("input"); 
    for(var i = 0; i < elements.length; i++) 
    { 
     /* do whatever you need to do with each input */ 
    } 
+0

vâng ... nhưng làm thế nào chúng ta sẽ nhận được các giá trị của thuộc tính name.Namely bar [name], bar [age] –

+0

@DimitrisPapageorgiou trong vòng lặp bạn sử dụng 'elments [i] .name ' – scrappedcola

+0

thanks .. Tôi đã làm nó và nó làm việc –

2

Bạn có thể lập bản đồ các yếu tố để một đối tượng như thế này.

function putIntoAssociativeArray() { 

    var 
     form = document.getElementById("foo"), 
     inputs = form.getElementsByTagName("input"), 
     input, 
     result = {}; 

    for (var idx = 0; idx < inputs.length; ++idx) { 
     input = inputs[idx]; 
     if (input.type == "text") { 
      result[input.name] = input.value; 
     } 
    } 

    return result; 
} 
1
var inputs = document.getElementsByTagName('input'); 
var field_name, value, matches, result = {}; 
for (var i = 0; i < inputs.length; i++) { 
    field_name = inputs[i].name; 
    value = inputs[i].value; 

    matches = field_name.match(/(.*?)\[(.*)\]/); 

    if (!results[matches[0]]) { 
     results[matches[0]] = {}; 
    } 
    results[matches[0]][matches[1]] = value; 
} 
2
var form = document.getElementById('foo'); 
var inputs = form.getElementsByTagName("input"); 
var regex = /(.+?)\[(.+?)\]/; 
var result = {}; 
for(var i = 0; i < inputs.length; ++i) { 
    var res = regex.exec(inputs[i].name); 
    if(res !== null) { 
     if(typeof result[ res[1] ] == 'undefined') result[ res[1] ] = {}; 
     result[ res[1] ][ res[2] ] = inputs[i].value; 
    } 
} 
3

tôi cần phải làm điều này bản thân mình và sau khi tìm thấy câu hỏi này tôi không thích bất kỳ câu trả lời: Tôi không thích regex và những người khác còn hạn chế.

Bạn có thể nhận được data biến nhiều cách. Tôi sẽ sử dụng phương pháp serializeArray của jQuery khi tôi thực hiện điều này.

function parseInputs(data) { 
    var ret = {}; 
retloop: 
    for (var input in data) { 
     var val = data[input]; 

     var parts = input.split('[');  
     var last = ret; 

     for (var i in parts) { 
      var part = parts[i]; 
      if (part.substr(-1) == ']') { 
       part = part.substr(0, part.length - 1); 
      } 

      if (i == parts.length - 1) { 
       last[part] = val; 
       continue retloop; 
      } else if (!last.hasOwnProperty(part)) { 
       last[part] = {}; 
      } 
      last = last[part]; 
     } 
    } 
    return ret; 
} 
var data = { 
    "nom": "123", 
    "items[install][item_id_4]": "4", 
    "items[install][item_id_5]": "16", 
    "items[options][takeover]": "yes" 
}; 
var out = parseInputs(data); 
console.log('\n***Moment of truth:\n'); 
console.log(out); 
Các vấn đề liên quan