6

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

( AutoMapperが .NETでどのように機能するかのようなものです。)

例えば:

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

_.mapperMethod(objectB);

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

3 に答える 3

11

おそらく_.extend()

_.extend(objectA, objectB);

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

追加のキーを取得したくない場合は、_.keys()and で使用でき_.pick()ます。

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

console.log(objectA);
// { 'name': 'Jonathan Conway', 'city': 'Sydney' }
于 2013-08-09T06:23:25.370 に答える
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.
于 2013-12-17T06:36:06.803 に答える