2012-05-21 761 views
8

Actualmente estoy trabajando en un gran proyecto de JavaScript y estoy luchando con la asignación de datos JSON entrantes (desde el backend) a mis propios objetos de JavaScript.¿Qué objeto JavaScript existen para mapear bibliotecas de objetos?

Estoy utilizando el marco de Knockout JavaScript MVVM y aunque incluye un mapping plugin, no me permite reasignar propiedades. Quiero lograr esto porque los datos JSON entrantes son demasiado finos, y me gustaría 'aplanar' mis objetos JS. Un ejemplo sigue.

Incomming datos.

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

Y me gustaría volver a asignar/aplanar esto:

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

Por lo tanto me gustaría proporcionar una configuración de mapeo, que detalla qué propiedades incomming debe correlacionarse con lo que los salientes. Se está configurando mucho como Dozer.

Mi pregunta es: ¿Hay alguna biblioteca por ahí capaz de lo que me gustaría lograr, o esto me requerirá construir mi propia biblioteca?

Respuesta

3

En realidad, el plugin knockoutjs mapeo le permite hacer precisamente eso:

En el ko.mapping.fromJS llamada, puede proporcionar un mapeo objeto que se utiliza para asignar las propiedades que contienen ...

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

Esto significa que al usar este mapeador con el plugin de mapeo, cada objeto se aplanará en un objeto que solo contenga su nombre como observable.

que lo utilice como esto:

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

En este caso, viewModel sólo tendrá un nombre de propiedad.

Usted puede leer más sobre esta opción en la documentación oficial here.

7

Bueno, creo que no hay ninguna biblioteca para este ya que esto suena bastante fácil de hacer.

Aquí se muestra un ejemplo:

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 aquí: http://jsfiddle.net/qG6hm/

+0

Gracias! Podría ser más limpio sin embargo. Llamar a la función recursiva volviendo a pasar el argumento parece feo. Sin embargo, no hay tiempo para ver cómo podría ser mejor en este momento. –

5

ha sido un tiempo desde que este tema se actualizó por última. Dado que las personas probablemente sigan buscando mapeadores objeto a objeto hoy en día:

El año pasado, creé un puerto de la implementación C# AutoMapper para escribir en TypeScript/JavaScript exactamente para este escenario. He puesto el código en GitHub (https://b.ldmn.nl/AutoMapperTS). También puede usar la biblioteca directamente con el paquete automapper-ts NPM o Bower.

la biblioteca es casi totalmente documentado. Además, ya están disponibles bastantes pruebas unitarias de Jasmine (la cobertura del código es aproximadamente del 95%). Deben proporcionarle una explicación de lo que necesita.

Espero que esta biblioteca se adapte a sus necesidades. ¡Si tiene alguna pregunta o comentario, no dude en ponerse en contacto conmigo!

Cuestiones relacionadas