2012-05-21 34 views
8

我目前正在研究一个大型的JavaScript项目,我正努力将JSON数据(从后端)映射到我自己的JavaScript对象。什么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一样。

我的问题是:是否有任何图书馆能够达到我想达到的目标,还是这需要我建立自己的图书馆?

回答

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中阅读关于此功能的更多信息。

7

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

下面是一个例子:

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/

+0

谢谢!但我可以变得更清洁。通过修改参数来调用递归函数看起来很难看。但现在没时间看看现在如何更好。 –

5

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

去年,我已经为此场景创建了一个C#AutoMapper实现的Ports到TypeScript/JavaScript。我已将代码放在GitHub上(https://b.ldmn.nl/AutoMapperTS)。您也可以直接使用automapper-ts NPM或Bower软件包来使用库。

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

我希望这个图书馆适合您的需求。如果您有任何问题和/或评论,请不要犹豫与我联系!