2013-08-09 4 views
6

क्या कोई अंडरस्कोर.जेएस फ़ंक्शन है जो अन्य ऑब्जेक्ट की गुणों के आधार पर एक ऑब्जेक्ट को किसी अन्य ऑब्जेक्ट पर मैप कर सकता है?underscore.js ऑब्जेक्ट-ऑब्जेक्ट मैपर?

(का प्रकार कैसे .NET में AutoMapper काम करता है।)

उदाहरण के लिये:

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

_.mapperMethod(objectB); 

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

उत्तर

10

संभवतः _.extend():

_.extend(objectA, objectB); 

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

आप अतिरिक्त चाबी लेने के लिए नहीं चाहते, तो , आप इसे _.keys() और _.pick():

के साथ उपयोग कर सकते हैं AutoMapperTS:
var keys = _.keys(objectA); 
_.extend(objectA, _.pick(objectB, keys)); 

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

धन्यवाद, कि पूरी तरह से काम करता है! मैंने वास्तव में एक ही समारोह में दोनों कॉलों को संयुक्त किया है: विस्तारित करें। https://gist.github.com/jonathanconway/6193584 – Jonathan

+0

अपने 'विस्तार पिक' फ़ंक्शन का आह्वान कैसे करें? –

+1

@IlyaPalkin यदि आपका मतलब jonathanconway की गिस्ट है, तो यह सिर्फ '_.extendPick (objectA, objectB) है;'। यह दोनों 'ऑब्जेक्ट ए' को संशोधित और वापस कर देगा। –

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

महीने की अंतिम दो में, मैं टाइपप्रति/जावास्क्रिप्ट के लिए एक सुंदर पूरा AutoMapper पुस्तकालय बंदरगाह बनाने में कामयाब रहे। पोर्ट करता है - कई अन्य विशेषताओं के बीच - फ़्लैटनिंग/नेस्टिंग और एसिंक्रोनस मैपिंग का समर्थन करता है।

कैसे NPM और बोवर का उपयोग कर इसे स्थापित करने के लिए, पुस्तकालय की जाँच कृपया GitHub पर सहित AutoMapperTS पुस्तकालय, के बारे में अधिक जानकारी के लिए: http://b.ldmn.nl/AutoMapperTS

+0

आपका काम अच्छा है लेकिन टाइपिंग समस्या है। यदि आप टाइपिंग समर्थन में सुधार कर सकते हैं तो बहुत से लोग इसका इस्तेमाल करेंगे। –

+0

क्या आपने टाइपस्क्रिप्ट परिभाषा फ़ाइल का उपयोग करने का प्रयास किया था (यह एनपीएम पैकेज का हिस्सा है)? आप जिस समस्या का जिक्र कर रहे हैं वह वास्तव में क्या है? – DotBert