2015-07-01 6 views
5

Ho una forma simile a questo:Form serializeArray get key: valore se key è array nidificato in HTML?

<select name="dog[0][name]">...</select> 
<select name="dog[0][color]">...</select> 
<select name="dog[0][height]">...</select> 
<select name="dog[0][weight]">...</select> 

<select name="dog[1][name]">...</select> 
<select name="dog[1][color]">...</select> 
<select name="dog[1][height]">...</select> 
<select name="dog[1][weight]">...</select> 
... 

Ora, se io chiamo $('form').serializeArray(); su questo l'uscita è in questo modo:

[ 
    { 
     name: "dog[0][name]", 
     value: "ABC" 
    }, 
    { 
     name: "dog[0][color]", 
     value: "Blue" 
    }, 
    { 
     name: "dog[0][height]", 
     value: "41" 
    }, 
    { 
     name: "dog[0][weight]", 
     value: "10" 
    }, 
    { 
     name: "dog[1][name]", 
     value: "XYZ" 
    }, 
    { 
     name: "dog[1][color]", 
     value: "Pink" 
    }, 
    { 
     name: "dog[1][height]", 
     value: "27" 
    }, 
    { 
     name: "dog[1][weight]", 
     value: "7" 
    }, 
    // ... 
] 

Come posso fare questo per essere come:

{ 
    dog: [ 
     0: {"name": "ABC", "color": "Blue", "height": 41, "weight": "10"} 
     1: {"name": "XYZ", "color": "Pink", "height": 27, "weight": "7"} 
    ] 
} 

? C'è un modo che non richiede cicli annidati?

+0

risposta è qui http://stackoverflow.com/questions/19643310/jquery-serialize-form-data-to-associated-array –

+0

C'è un plugin per questo se non vuoi crearne uno: https: // github .com/Macek/jquery-serialize-oggetto –

risposta

0

OK, so che la mia domanda è specifica del caso, ma forse questo aiuterà anche qualcuno. Sono venuto con la mia semplice (credo) la soluzione (è in CoffeeScript):

values = $('form').serializeArray() 

model = {} 
for val in values 
    matches = val.name.match /dog\[(.*)\]\[(.*)\]/ 
    model[matches[1]] = {} if !model[matches[1]] 
    model[matches[1]][matches[2]] = val.value 
console.log model 

Tradotto in JS puri che dovrebbe essere:

var values = $('form').serializeArray(); 

var model = {}; 
for (var i = 0, var len = values.length; i < len; i++) { 
    var val = values[i]; 
    var matches = val.name.match(/dog\[(.*)\]\[(.*)\]/); 
    if (!model[matches[1]]) { 
     model[matches[1]] = {}; 
    } 
    model[matches[1]][matches[2]] = val.value; 
} 
console.log(model); 

produce questo risultato:

{ 
    0: 
     { 
      "name": "ABC", 
      "color": "Blue", 
      "height": "41", 
      "weight": "10" 
     } 
    1: 
     { 
      "name": "XYZ", 
      "color": "Pink", 
      "height": "27", 
      "weight": "7" 
     } 
}