我有一个具有以下结构的JSON文件:
{ ShippingDate: '06.09.2016',
'Order ID': 200003946,
ID: 751,
Product: 'Mobile Phone'},
{ ShippingDate: '06.09.2016',
'Order ID': 200003946,
ID: 751,
Product: 'TV'},
{ ShippingDate: '06.09.2016',
'Order ID': 200003946,
ID: 751,
Product: 'Batteries'},
{ ShippingDate: '06.09.2016',
'Order ID': 200003926,
ID: 752,
Product: 'Car'},
所以前三个条目是同一个客户的订单。第四个是另一个客户的订单。
我知道想使用handlebars.js模板创建一个html文件,其中包含订单所包含的每个订单。所以我准备了这个模板:
<div class="header">
<h1>{{ID}}</h1>
</div>
<div class="body">
<ul>
{{#each Product}}
<li>{{this}}</li>
{{/each}}
</ul>
</div>
我现在遇到了问题,我需要为模板准备这种数据。在这里我偶然发现了一些问题。我的代码就像这样
...
var f = fs.readFileSync('data.json').toString();
var lines = JSON.parse(f);
var items = [];
//prepare products of one customer and put them into an array
for (var key in lines) {
var line = lines[key];
var nextLine = lines[(parseInt(key)+1)];
if (nextLine !== undefined && line !== undefined) {
if (line['Order ID'] !== nextLine['Order ID']) {
items.push('Product: ' + line.Product);
}//if
}//if
}//for
var data = lines;
fs.readFile(template.html, 'utf-8', function(error, source){
var template = handlebars.compile(source);
var html = template(data);
console.log(html)
});
这不起作用 - 如何准备我的项目数组,以便我可以在模板中使用products变量访问这些产品?另外,我需要将ID和Shipping Date等信息添加到该json字符串中。数据格式必须如下所示:
var data = {
ShippingDate: '06.09.2016',
ID: '751',
Product: ['Mobile Phone', 'TV', 'Batteries']
}
任何人都可以在这里帮忙吗?
答案 0 :(得分:1)
这是一种方法:
var data = [{
"ShippingDate": "06.09.2016",
"Order ID": 200003946,
"ID": 751,
"Product": "Mobile Phone"
}, {
"ShippingDate": "06.09.2016",
"Order ID": 200003946,
"ID": 751,
"Product": "TV"
}, {
"ShippingDate": "06.09.2016",
"Order ID": 200003946,
"ID": 751,
"Product": "Batteries"
}, {
"ShippingDate": "06.09.2016",
"Order ID": 200003926,
"ID": 752,
"Product": "Car"
}];
var newData = {};
data.forEach(function(item) {
if (typeof newData[item.ID] === 'undefined') {
newData[item.ID] = {
ShippingDate: item.ShippingDate,
ID: item.ID,
Product: []
};
}
newData[item.ID].Product.push(item.Product);
});
newData = Object.values(newData);