Underscore.js对象映射器?

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' };
3个回答

11

可能是_.extend()函数:

_.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' }

谢谢,这完美地解决了问题!我实际上将这两个调用合并到了一个函数中:extendPick。https://gist.github.com/jonathanconway/6193584 - Jonathan
如何调用您的 extendPick 函数? - Ilya Palkin
1
如果你指的是jonathanconway的gist,那么它只是_.extendPick(objectA, objectB);。它会同时修改并返回objectA - Jonathan Lonowski

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.

@Naor:抱歉我回复你这么晚。我已经更新了映射,也支持数组映射。希望它对你有用。谢谢。 - Nguyen Tran

0
在过去的几个月中,我成功地为TypeScript / JavaScript创建了一个相当完整的AutoMapper库端口:AutoMapperTS。该端口支持许多其他功能,包括平铺/嵌套和异步映射。
有关AutoMapperTS库的更多信息,包括如何使用NPM和Bower安装它,请在GitHub上查看该库:http://b.ldmn.nl/AutoMapperTS

你的工作很不错,但是输入有些问题。如果你能改进输入支持,许多人会使用它。 - Shivprasad Koirala
你尝试使用TypeScript定义文件了吗(它是NPM包的一部分)?你具体指的问题是什么? - DotBert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接