15

我目前正在处理一个大型 JavaScript 项目,并且正在努力将传入的 JSON 数据(来自后端)映射到我自己的 JavaScript 对象。

我正在使用 Knockout JavaScript MVVM 框架,虽然它包含一个映射插件,但它不允许我实际重新映射属性。我想实现这一点,因为传入的 JSON 数据粒度太细,我想“扁平化”我的 JS 对象。下面是一个例子。

传入数据。

Object : {
    Description: {
        Id : 1,
        Title : 'ProductX'
    },
    Price : {
        Last : 12,
        Currency : 3
    }
}

我想将其重新映射/展平为:

var mappedObject = {
    id : 1,
    title: 'ProductX',
    price : 12,
    currency : 3
}

因此,我想提供一个映射配置,详细说明应该将哪些传入属性映射到哪些传出属性。很像正在配置推土机。

我的问题是:是否有任何图书馆能够实现我想要实现的目标,或者这是否需要我建立自己的图书馆?

4

4 回答 4

10

自上次更新此主题以来已经有一段时间了。由于人们现在可能仍在寻找对象到对象的映射器:

去年,我为这种场景创建了一个将 C# AutoMapper 实现移植到 TypeScript / JavaScript 的端口。我已将代码放在 GitHub ( https://b.ldmn.nl/AutoMapperTS )。您还可以使用 automapper-ts NPM 或 Bower 包直接使用该库。

该库几乎完全记录在案。此外,已经有相当多的 Jasmine 单元测试可用(代码覆盖率约为 95%)。他们应该为您提供一些关于您需要什么的解释。

我希望这个库能满足你的需要。如果您有任何问题和/或意见,请不要犹豫与我联系!

于 2016-06-17T07:19:02.983 回答
8

好吧,我认为没有任何图书馆可以做到这一点,因为这听起来很容易做到。

这是一个例子:

var obj = {
    Description: {
        Id : 1,
        Title : 'ProductX'
    },
    Price : {
        Last : 12,
        Currency : 3
    }
},
    mappedObject = {};

function mapThat( obj, mappedObject ) {
    Object.keys( obj ).forEach( function( key ) {
        if ( typeof obj[ key ] === 'object' ) {
            // If it's an object, let's go recursive
            mapThat( obj[ key ], mappedObject );
        }
        else {
            // If it's not, add a key/value
            mappedObject[ key.toLowerCase() ] = obj[ key ];
        }
    } );
}

mapThat( obj, mappedObject );

console.log( mappedObject );​

在这里演示:http: //jsfiddle.net/qG6hm/

于 2012-05-21T13:11:32.073 回答
3

实际上,knockoutjs 映射插件允许您这样做:

ko.mapping.fromJS调用中,您可以提供一个映射对象,该对象将用于映射包含的属性...

var mapper = {
    create: function(options){
        return { name: ko.observable(options.data.name) };
    }
};

这意味着将这个映射器与映射插件一起使用,每个对象都将被展平为一个仅包含其名称作为可观察对象的对象。

你像这样使用它:

var viewModel = ko.mapping.fromJS({id: 1, name: "a", desc: "b"}, mapper);

在这种情况下,viewModel将只有一个属性名称。

您可以在此处的官方文档中阅读有关此功能的更多信息。

于 2012-05-21T13:17:45.270 回答
2
  1. 您可以使用Object-mapper,这是用于 Javascript/JSON 中对象映射的非常基本且简单的库。使用此库时,您需要在单独的文件中指定映射属性组合以及源和目标类型。

  1. 还有另一个库AutoMapper,这有点先进。它可以根据属性名称自动处理映射,但是您仍然可以提及自定义映射,因为它不是直截了当的。如果您来自 .net 背景,此库的实现方式与 C# automapper 相同。
于 2018-07-16T12:29:12.273 回答