2013-08-09 5 views
6

他のオブジェクトのプロパティに基づいて、あるオブジェクトを別のオブジェクトにマッピングできるUnderscore.js関数はありますか?Underscore.jsオブジェクトオブジェクトマッパー?

(の種類どのように.NETでAutoMapper作品。)例えば

:おそらく_.extend()

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

_.mapperMethod(objectB); 

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

答えて

10

_.extend(objectA, objectB); 

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

あなたは追加のキーをピックアップしたくない場合_.keys()_.pick()と一緒に使用できます。

数ヶ月の最後のカップルで
var keys = _.keys(objectA); 
_.extend(objectA, _.pick(objectB, keys)); 

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

おかげで、それは完璧に動作します!私は実際に両方の呼び出しを1つの関数、すなわちextendPickに結合しました。 https://gist.github.com/jonathanconway/6193584 – Jonathan

+0

'extendPick'関数を呼び出す方法は? –

+1

@IlyaPalkinもしあなたがjonathanconwayの要点を意味するなら、それはちょうど '_.extendPick(objectA、objectB);'です。 '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

どのように配列を扱うのですか? – Naor

+0

@Naor:申し訳ありません。私はマッピングを更新しており、配列マッピングもサポートしています。あなたのために働くことを願っています。おかげで –

0

、私は活字体/ JavaScriptのためにかなりの完全なAutoMapperライブラリポートを作成するために管理している:AutoMapperTS。このポートは、他の多くの機能の中でもフラット化/ネストと非同期マッピングをサポートしています。 GitHubの上のライブラリをチェックしてみてください、NPMとバウアーを使用して、それをインストールする方法を含むAutoMapperTSライブラリ、詳細については

http://b.ldmn.nl/AutoMapperTS

+0

あなたの仕事は良いですが、入力が問題です。あなたが人々の入力支援を向上させることができる場合は、これを使用します。 –

+0

TypeScript定義ファイル(NPMパッケージの一部)を使用しようとしましたか?あなたが指摘している問題は何ですか? – DotBert

関連する問題