2013-08-09 10 views
6

Gibt es eine Underscore.js-Funktion, die ein Objekt basierend auf den Eigenschaften des anderen Objekts einem anderen Objekt zuordnen kann?Underscore.js Objekt-Objekt-Mapper?

(Art, wie AutoMapper Werke in .NET.)

Zum Beispiel:

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

_.mapperMethod(objectB); 

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

Antwort

10

Möglicherweise _.extend():

_.extend(objectA, objectB); 

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

Wenn Sie nicht wollen, zusätzliche Schlüssel abholen Sie können es mit _.keys() und _.pick():

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

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

Danke, das funktioniert perfekt! Ich habe beide Aufrufe in einer einzigen Funktion zusammengefasst: extendPick. https://gist.github.com/jonathanconway/6193584 – Jonathan

+0

Wie Sie Ihre 'extendPick' Funktion aufrufen? –

+1

@IlyaPalkin Wenn Sie Jonathanconways Gist meinen, dann ist es nur '_.extendPick (objectA, objectB);'. Es wird sowohl "objectA" ändern als auch zurückgeben. –

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

Wie arbeiten Sie mit Arrays? – Naor

+0

@Naor: Sorry, ich brauche so lange, um zu antworten. Ich habe das Mapping aktualisiert, es unterstützt auch Array Mapping. Hoffe es funktioniert für dich. Danke –

0

In den letzten paar Monaten habe ich für Typoskript/JavaScript eine ziemlich komplette AutoMapper Bibliothek Port erstellen verwaltet. Der Port unterstützt - neben vielen anderen Funktionen - das Abflachen/Verschachteln und asynchrone Zuordnungen.

Weitere Informationen über die AutoMapperTS Bibliothek, darunter, wie es installieren NPM und Bower verwenden, finden Sie in der Bibliothek auf GitHub Besuche: http://b.ldmn.nl/AutoMapperTS

+0

Ihre Arbeit ist gut, aber die Typings sind ein Problem. Wenn Sie die Tippunterstützung verbessern können, werden viele Leute dies verwenden. –

+0

Haben Sie versucht, die TypeScript-Definitionsdatei zu verwenden (sie ist Teil des NPM-Pakets)? Was genau ist das Problem, auf das du dich beziehst? – DotBert