2012-05-21 13 views
8

Attualmente sto lavorando su un grande progetto JavaScript e sto lottando con la mappatura dei dati JSON incomming (dal back-end) ai miei oggetti JavaScript.Quali oggetti JavaScript per le librerie di mappatura di oggetti esistono?

Sto utilizzando il framework MVVM di Knockout JavaScript e sebbene includa un mapping plugin, non mi consente di rimappare effettivamente le proprietà. Voglio raggiungere questo obiettivo perché i dati JSON in ingresso sono troppo chiari e vorrei "appiattire" i miei oggetti JS. Segue un esempio.

Dati in arrivo.

Object : { 
    Description: { 
     Id : 1, 
     Title : 'ProductX' 
    }, 
    Price : { 
     Last : 12, 
     Currency : 3 
    } 
} 

E vorrei rimappare/appiattire questo:

var mappedObject = { 
    id : 1, 
    title: 'ProductX', 
    price : 12, 
    currency : 3 
} 

Quindi Vorrei fornire una configurazione di mappatura, specificando quali proprietà incomming dovrebbero essere mappati a quali quelli in uscita. Molto come Dozer è in fase di configurazione.

La mia domanda è: ci sono librerie là fuori in grado di quello che mi piacerebbe raggiungere, o questo mi richiederà di costruire la mia libreria?

risposta

3

In realtà, il plugin knockoutjs mappatura permette di fare proprio questo:

Nella ko.mapping.fromJS chiamata, è possibile fornire una mappatura oggetto che verrà utilizzato per mappare le proprietà contenenti ...

var mapper = { 
    create: function(options){ 
     return { name: ko.observable(options.data.name) }; 
    } 
}; 

Ciò significa che utilizzando questo mapper con il plugin di mappatura, ogni oggetto verrà appiattito su un oggetto che contiene solo il suo nome come osservabile.

È usare in questo modo:

var viewModel = ko.mapping.fromJS({id: 1, name: "a", desc: "b"}, mapper); 

In questo caso, viewModel avrà solo un nome di proprietà.

Ulteriori informazioni su questa funzione sono disponibili nella documentazione ufficiale here.

7

Beh, non penso ci sia alcuna libreria per questo, perché sembra abbastanza facile da fare.

Ecco un esempio:

var obj = { 
    Description: { 
     Id : 1, 
     Title : 'ProductX' 
    }, 
    Price : { 
     Last : 12, 
     Currency : 3 
    } 
}, 
    mappedObject = {}; 

function mapThat(obj, mappedObject) { 
    Object.keys(obj).forEach(function(key) { 
     if (typeof obj[ key ] === 'object') { 
      // If it's an object, let's go recursive 
      mapThat(obj[ key ], mappedObject); 
     } 
     else { 
      // If it's not, add a key/value 
      mappedObject[ key.toLowerCase() ] = obj[ key ]; 
     } 
    }); 
} 

mapThat(obj, mappedObject); 

console.log(mappedObject);​ 

Demo qui: http://jsfiddle.net/qG6hm/

+0

Grazie! Potrei essere più pulito però. Chiamare la funzione ricorsiva ripetendo l'argomento sembra brutto. Non c'è tempo per vedere come potrebbe essere meglio in questo momento però. –

5

È passato un po 'di tempo dall'ultimo aggiornamento di questo argomento. Poiché le persone probabilmente stanno ancora cercando i mappatori da oggetto a oggetto al giorno d'oggi:

L'anno scorso, ho creato una porta dell'implementazione AutoMapper C# su TypeScript/JavaScript esattamente per questo scenario. Ho inserito il codice in GitHub (https://b.ldmn.nl/AutoMapperTS). Puoi anche usare la libreria direttamente usando il pacchetto automapper-ts NPM o Bower.

La libreria è quasi completamente documentata. Inoltre, sono già disponibili molti test di unità Jasmine (la copertura del codice è circa del 95%). Dovrebbero fornirti qualche spiegazione su ciò di cui hai bisogno.

Spero che questa libreria soddisfi le vostre esigenze. In caso di domande e/o commenti, non esitate a contattarmi!

Problemi correlati