2013-08-09 20 views
6

Esiste una funzione Underscore.js in grado di mappare un oggetto su un altro oggetto, in base alle proprietà dell'altro oggetto?Underscore.js mapper oggetto-oggetto?

(Tipo di come AutoMapper opere in .NET.)

Per esempio:

var objectA = { 'name': 'Jonathan', 'city': 'Sydney' }; 
var objectB = { 'name': 'Jonathan Conway', 'city': 'Sydney', 'errors': [] } 

_.mapperMethod(objectB); 

=> { 'name': 'Jonathan Conway', 'city': 'Sydney' }; 

risposta

10

Possibilmente _.extend():

_.extend(objectA, objectB); 

console.log(objectA); 
// { 'name': 'Jonathan Conway', 'city': 'Sydney', 'errors': [] } 

Se non si vuole prendere tasti aggiuntivi , puoi usarlo con _.keys() e _.pick():

var keys = _.keys(objectA); 
_.extend(objectA, _.pick(objectB, keys)); 

console.log(objectA); 
// { 'name': 'Jonathan Conway', 'city': 'Sydney' } 
+0

Grazie, che funziona perfettamente! In realtà ho combinato entrambe le chiamate in un'unica funzione: extendPick. https://gist.github.com/jonathanconway/6193584 – Jonathan

+0

Come richiamare la funzione 'extendPick'? –

+1

@IlyaPalkin Se intendi l'essenza di jonathanconway, allora è solo '_.extendPick (oggettoA, oggettoB);'. Cambierà e restituirà 'objectA'. –

2
Below is my auto mapper 

    var sourceObj, desObj; 
    var map: function (source, destination) { 
        var desKeys = _.keys(destination), functions; 
        _.extend(destination, _.pick(source, desKeys)); 
        sourceObj = source; 
        desObj = destination; 

        functions = { 
         forMember: function (sourceKey, desKey) { 
          var keys = sourceKey.split('.'), sourceValue = sourceObj, index = 0; 

          // incase sourceKey is a nested object like objectA.Value 
          if (keys.length) { 
           while (index < keys.length) { 
            sourceValue = sourceValue[keys[index]]; 
            index++; 
           } 
           desObj[desKey] = sourceValue; 
          } 
          else { 
           desObj[desKey] = sourceObj[sourceKey]; 
          } 

          return functions; 
         } 
        }; 
        return functions; 
       } 

var mapList: function (listSource, listDestination) { 
        _.each(listDestination, function(destination, i){ 
         var source = listSource[i]; 
         map(source,destination); 
         }); 

        functions = { 
         forMember: function (sourceKey, desKey) { 
          _.each(listDestination, function(destination, i){ 
           var source = listSource[i]; 
           map(source,destination) 
           .forMember(sourceKey, desKey); 
          }); 

          return functions; 
         } 
        }; 
        return functions; 
       } 


and how to use it 

    var source = { 
    Name: 'Nguyen Tran', 
    Age: '30', 
    Address: { 
       Street: '121 Le Van Viet', 
       City: 'HCM' 
       } 
    }; 

    var destination = { 
     Name: 'test', 
     age: '25', 
     Street: '', 
     City: '' 
    }; 
     autoMapper.map(source, destination) 
        .forMember('Age', 'age') 
        .forMember('Address.Street', 'Street') 
        .forMember('Address.City', 'City') 

Hope this work for you. 
+0

Come si lavora con gli array? – Naor

+0

@Naor: Scusa ci ho messo tanto tempo a rispondere. Ho aggiornato la mappatura, supporta anche la mappatura degli array. Spero che funzioni per te. Grazie –

0

Negli ultimi due mesi, sono riuscito a creare una porta libreria automapper abbastanza completa per dattiloscritto/JavaScript: AutoMapperTS. La porta fa - tra le molte altre caratteristiche - supporto di appiattimento/nidificazione e mappature asincrone.

Per ulteriori informazioni sulla libreria AutoMapperTS, tra cui come installarlo utilizzando NPM e Bower, si prega di consultare la biblioteca su GitHub: http://b.ldmn.nl/AutoMapperTS

+0

Il tuo lavoro è buono ma le tipizzazioni sono un problema. Se puoi migliorare il supporto alla digitazione, molte persone lo useranno. –

+0

Hai provato a utilizzare il file di definizione TypeScript (fa parte del pacchetto NPM)? Qual è esattamente il problema a cui ti riferisci? – DotBert

Problemi correlati