2017-01-10 27 views
0

ich eine Form haben, und ich möchte es ein Ajax-Endpunkt senden, denn dies habe ich diese Hilfsmethode:Wie Objektschlüssel Punktnotation konvertieren Baum auf Objekt in Javascript

$.fn.serializeFormToObject = function() { 
     //serialize to array 
     var data = $(this).serializeArray(); 
     //add also disabled items 
     $(':disabled[name]', this) 
     .each(function() { 
      data.push({ name: this.name, value: $(this).val() }); 
     }); 

     //map to object 
     var obj = {}; 
     data.map(function(x) { obj[x.name] = x.value; }); 
     return obj; 
    }; 

Das Problem ist, dass ich Punktnotation haben in einigen der Namen meiner Form (mit MVC stark typisierte Modell) so habe ich dieses Objekt als Ergebnis:

Task.Addresses.Box:"" 
Task.Addresses.City:"Limal" 
Task.Addresses.Country:"Belgique" 
Task.Deadline:"1/10/2017 12:18:18 PM" 
Task.TaskSourceId:"1" 

Und das Ergebnis wäre zu erwarten:

{ Task : { Addresses: { Box: "", City: "Limal", Country: "Belgique"}, Deadline: "1/10/2017 12:18:18 PM", TaskSourceId:"1" } } 

Ich benutze die lodash-Bibliothek, aber nach einigen Stunden kann ich keinen Weg finden, dieses erwartete Ergebnis zu erzielen.

Kann mir jemand einen funktionierenden Javascript Helfer zur Verfügung stellen, um das erwartete verschachtelte Objekt zu geben?

Edit: Für duplizierte Frage, die andere Frage stellen sich nicht um kombinierte verschachtelte Objekt zusammen

Nach der Antwort von @ ori-Drori, Dieser Code funktioniert wie erwartet:

$.fn.serializeFormToObject = function() { 
    //serialize to array 
    var data = $(this).serializeArray(); 
    //add also disabled items 
    $(':disabled[name]', this) 
     .each(function() { 
      data.push({ name: this.name, value: $(this).val() }); 
     }); 

    //map to object 
    var obj = {}; 
    data.map(function (x) { obj[x.name] = x.value; }); 

    var objNested = {}; 
    _.forEach(obj, function (value, key) { _.set(objNested, key, value) }); 
    return objNested; 
}; 
+0

Mögliche Duplikat [Konvertieren JavaScript-String in Punktnotation in einen Objektverweis] (http://stackoverflow.com/questions/6393943/convert-javascript-string-in-dot- Notation-in-Objekt-Referenz – haxxxton

Antwort

2

Iterate die Daten unter Verwendung Array#forEach, und den Wert auf dem Pfad (name) ASSIGN _.set():

data.forEach(function(x) { _.set(obj, x.name, x.value) }); 

I Sie haben keine Originaldaten, daher hier eine Demo mit den von Ihnen angegebenen Schlüsselwerten.

var fields = { 
 
    "Task.Addresses.Box": "", 
 
    "Task.Addresses.City": "Limal", 
 
    "Task.Addresses.Country": "Belgique", 
 
    "Task.Deadline": "1/10/2017 12:18:18 PM", 
 
    "Task.TaskSourceId": "1" 
 
}; 
 

 
var obj = {}; 
 

 
_.forEach(fields, function(value, key) { 
 
    _.set(obj, key, value); 
 
}); 
 

 
console.log(obj);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

Verwandte Themen