2011-08-26 18 views
5

Digamos que tengo esto:cómo analizar los valores de entrada [] y los puso en una matriz de JavaScript

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

¿Cómo puedo obtener los valores de las entradas de la matriz dentro de la forma foo y ponerlos en una matriz asociativa/objeto como éste:

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

PS No quiero usar ningún marco para esto.

+3

Por "Pure JavaScript" ¿Debo decir que significa "sin usar JavaScript escrito por otras personas, como los equipos jQuery o YUI"? (A diferencia de "Sin Flash" o "Sin DOM"?) – Quentin

+2

Técnicamente, jQuery *** es *** "JavaScript puro". ¿Desea comprender cómo se lee [form element with old-old DOM] (https://developer.mozilla.org/en/DOM/HTMLFormElement) o quiere ser más productivo y Get Stuff Done? –

+0

es 'querySelectorAll' también puro? – pimvdb

Respuesta

2

Esto le dará los elementos:

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

sí ... pero cómo vamos a obtener los valores de los atributos del nombre.Nombre bar [nombre], barra [edad] –

+0

@DimitrisPapageorgiou en el bucle for usa 'elments [i] .name' – scrappedcola

+0

gracias .. . Lo hice y funcionó –

2

puede asignar a los elementos de un objeto como éste.

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

que tenía que hacer esto por mí mismo y después de encontrar esta pregunta que no me gusta ninguna de las respuestas: no me gusta la expresión regular y los otros son limitadas.

Puede obtener la variable data de muchas maneras. Usaré el método serializeArray de jQuery cuando implemente esto.

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); 
Cuestiones relacionadas