我正在学习vuejs并且正在实现一个报告系统,从模拟API获取一些数据并将其输出到表中。该数据返回多年的月订单号和值。这里有一个数据示例:https://api.myjson.com/bins/u5gp6。
我想要做的是循环每年和每月并输出订单数量和订单价值,每年总和。
HTML是这样的:
<div id="app">
<div v-for="report in reports">
<h2>{{ report.year }}</h2>
<table class="table table-striped">
<thead>
<tr>
<th>Month</th>
<th>Number of orders</th>
<th>Total revenue</th>
<th>Average order</th>
</tr>
</thead>
<tbody>
<tr v-for="value in report.values">
<td>{{ value.month }} {{ value.year }}</td>
<td>{{ value.orders }}</td>
<td>£{{ value.revenue }}</td>
<td>£{{ value.average }}</td>
</tr>
</tbody>
<tfoot v-if="reports">
<tr>
<td>Total {{report.year }}</td>
<td>{{ totalOrders }}</td>
<td>£{{ totalRevenue }}</td>
<td></td>
</tr>
</tfoot>
</table>
</div>
</div>
JS是这样的:
const app = new Vue({
el: '#app',
data: {
reports: []
},
created() {
fetch('https://api.myjson.com/bins/u5gp6')
.then(response => response.json())
.then(json => {
this.reports = json.reports
});
},
computed: {
totalOrders: function () {
},
totalRevenue: function () {
}
}
});
这里可以看到一个小提琴:https://jsfiddle.net/eywraw8t/63295/
我正在努力解决的问题是计算每年的totalOrders
和totalRevenue
值。
我尝试了各种各样的事情,例如在计算的总函数中添加reduce
函数,但却无法使任何东西起作用。我想我对这是一个嵌套循环的事实感到困惑。
有人可以建议如何处理此问题,以便正确填充totalOrders
和totalRevenue
吗?
非常感谢。
答案 0 :(得分:1)
您可以在原始数组上使用reduce
获取按年度分列的销售和订单报告,然后在每年reduce
调用values
。
例如:
let reports = [{"year":"2018","values":[{"month":"Jan","orders":"5","revenue":"50.00","average":"10.00"},{"month":"Feb","orders":"5","revenue":"50.00","average":"10.00"},{"month":"Mar","orders":"5","revenue":"50.00","average":"10.00"},{"month":"Apr","orders":"5","revenue":"50.00","average":"10.00"},{"month":"May","orders":"5","revenue":"50.00","average":"10.00"},{"month":"Jun","orders":"5","revenue":"50.00","average":"10.00"},{"month":"Jul","orders":"5","revenue":"50.00","average":"10.00"},{"month":"Aug","orders":"5","revenue":"50.00","average":"10.00"},{"month":"Sep","orders":"5","revenue":"50.00","average":"10.00"},{"month":"Oct","orders":"5","revenue":"50.00","average":"10.00"},{"month":"Nov","orders":"5","revenue":"50.00","average":"10.00"},{"month":"Dec","orders":"5","revenue":"50.00","average":"10.00"}]},{"year":"2017","values":[{"month":"Jan","orders":"5","revenue":"50.00","average":"10.00"},{"month":"Feb","orders":"5","revenue":"50.00","average":"10.00"},{"month":"Mar","orders":"5","revenue":"50.00","average":"10.00"},{"month":"Apr","orders":"5","revenue":"50.00","average":"10.00"},{"month":"May","orders":"5","revenue":"50.00","average":"10.00"},{"month":"Jun","orders":"5","revenue":"50.00","average":"10.00"},{"month":"Jul","orders":"5","revenue":"50.00","average":"10.00"},{"month":"Aug","orders":"5","revenue":"50.00","average":"10.00"},{"month":"Sep","orders":"5","revenue":"50.00","average":"10.00"},{"month":"Oct","orders":"5","revenue":"50.00","average":"10.00"},{"month":"Nov","orders":"5","revenue":"50.00","average":"10.00"},{"month":"Dec","orders":"5","revenue":"50.00","average":"10.00"}]}]
function totalRevenue(){
return reports.reduce((obj, year) => {
obj[year.year] = year.values.reduce((total, month) => {
return total + parseInt(month.revenue)
}, 0)
return obj
}, {})
}
console.log(totalRevenue())
&#13;
通过将month.revenue
替换为month.orders
,您可以对订单执行相同的操作。您也可以让这些函数采用year
参数,然后报告该年份,但如果您每年在页面上进行报告,则只需循环一次即可。
答案 1 :(得分:1)
我发现使用methods
并将循环中当前年份的values
对象作为参数传递,我只能根据该特定的订单和收入调用reduce方法一年,每次都不必遍历一切。生成的工作代码是......
HTML:
<div id="app">
<div v-for="report in reports">
<h2>{{ report.year }}</h2>
<table class="table table-striped">
<thead>
<tr>
<th>Month</th>
<th>Number of orders</th>
<th>Total revenue</th>
<th>Average order</th>
</tr>
</thead>
<tbody>
<tr v-for="value in report.values">
<td>{{ value.month }} {{ value.year }}</td>
<td>{{ value.orders }}</td>
<td>£{{ value.revenue }}</td>
<td>£{{ value.average }}</td>
</tr>
</tbody>
<tfoot v-if="reports">
<tr>
<td>Total {{report.year }}</td>
<td>{{ totalOrders(report.values) }}</td>
<td>£{{ totalRevenue(report.values) }}</td>
<td></td>
</tr>
</tfoot>
</table>
</div>
</div>
JS:
const app = new Vue({
el: '#app',
data: {
reports: []
},
created() {
fetch('https://api.myjson.com/bins/16731e')
.then(response => response.json())
.then(json => {
this.reports = json.reports
});
},
methods: {
totalOrders: function (values) {
return values.reduce((acc, val) => {
return acc + parseInt(val.orders);
}, 0);
},
totalRevenue: function (values) {
return values.reduce((acc, val) => {
return acc + parseInt(val.revenue);
}, 0);
}
}
});