我需要使用NodeJS将各种结构化格式的信息转换为其他格式(例如html或文本)。所以我采用这种方法将源格式转换为基于JSON-Schemas的JSON。我也可以根据Pug模板将生成的JSON转换为文本。
我现在正在寻找的是一种灵活的方式来标准化数据并简化JSON中的结构,因此在例如日期和时间格式。
此类对象的一个例子是:
{
header: {
sender: {
// more properties
id: '12345';
}
receiver: {
// more properties
id: '987654';
}
date: {
date: '170910',
time: '0922'
}
// more properties
}
// more properties
someMore: {
birthdate: {
year: 2016,
month: 5,
day: 11
}
otherProperty: {
// more properties
date: '20170205'
}
}
}
我想将此转换为
{
header: {
senderId: '12345',
receiverId: '987654'
date: '20170910T0922'
}
// more properties
someMore: {
birthdate: '20160511',
otherProperty: {
// more properties
date: '20170205'
}
}
}
我们的想法是递归循环遍历对象中的所有属性,并使用一个具有een条目的Map,用于应该对其执行操作的每个属性,例如
var map = new Map();
map.set('sender', getSender());
map.set('date', normalizeDate());
map.set('birthdate', normalizeDate());
对于每个属性键,检查映射,如果它返回一个函数,则执行该函数,否则执行 该属性已创建,循环继续。
但是,我之前已经解决了这个问题的独特印象,所以我想知道是否有可以使用的npm包呢?
答案 0 :(得分:0)
在搜索了更多内容并尝试了不同的JSON变换器之后,我选择dot-object,因为它提供了一种简单的方法来转换部分结构中的多个规则'一气呵成。
我放弃了编写大量常规规范化函数的想法,并且只针对最明显的函数(性别和日期/时间)进行了解决,并通过将各种结构转换为单个标准化结构来处理它们,然后应用适当的功能
这可能不是最优雅的方法,但我是时间限制,这是有效的。
要按照问题中的描述将源转换为结果,请使用以下代码:
const dot = require('dot-object');
const rules = {
'header.sender.id': 'header.senderId',
'header.receiver.id': 'header.receiverId'
};
const target = {};
dot.transform(rules, src, target);
// normalizing
target.date = normalizeDate(target.date);
target.someMore.birthdate = normalizeDate(target.someMore.birthdate);
target.someMore.otherProperty.date = normalizeDate(target.someMore.otherProperty.date);