【问题标题】:What JavaScript object to object mapping libraries exist? [closed]存在哪些 JavaScript 对象到对象映射库? [关闭]
【发布时间】:2012-05-27 22:05:52
【问题描述】:

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

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

传入数据。

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

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

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

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

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

【问题讨论】:

    标签: javascript mapping


    【解决方案1】:

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

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

    该库几乎有完整的文档。此外,已经有相当多的 Jasmine 单元测试可用(代码覆盖率约为 95%)。他们应该向您解释您需要什么。

    我希望这个库能满足您的需求。如果您有任何问题和/或意见,请随时与我联系!

    【讨论】:

      【解决方案2】:

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

      这是一个例子:

      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/

      【讨论】:

      • 谢谢!不过我可以更干净。通过重新传递参数来调用递归函数看起来很难看。不过,现在没有时间看看它会如何变得更好。
      【解决方案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 将只有一个属性名称。

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

      【讨论】:

        【解决方案4】:
        1. 你可以使用Object-mapper,这是一个非常基本和简单的Javascript/JSON对象映射库。 使用此库时,您需要在单独的文件中指定映射属性组合以及源和目标类型。

        1. 还有另外一个库AutoMapper,这个有点高级。它可以根据属性名称自动处理映射,但是您仍然可以提及自定义映射,因为它不是直截了当的。 如果您来自 .net 背景,此库的实现方式与 C# automapper 相同。

        【讨论】:

        • 3.我还创建了Morphism,它有利于 TypeScript 的支持。当您开始拥有复杂的映射或嵌套映射时,这可能会有所帮助。希望它可以帮助希望解决此类任务的人
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-23
        • 2012-02-06
        • 2013-07-08
        相关资源
        最近更新 更多