【问题标题】:Sum values in nested loop in vuejsvuejs中嵌套循环中的总和值
【发布时间】:2018-06-05 16:49:50
【问题描述】:

我正在学习 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/

我正在努力的部分是计算每年的 totalOrderstotalRevenue 值。

我尝试了各种方法,例如在计算的总函数中添加一个 reduce 函数,但就是无法工作。我想我对这是一个嵌套循环感到困惑。

谁能建议如何解决这个问题,以便正确填充 totalOrderstotalRevenue

非常感谢。

【问题讨论】:

    标签: vuejs2


    【解决方案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);
        }
      }
    });
    

    工作小提琴:https://jsfiddle.net/4js8L3p9/.

    【讨论】:

      【解决方案2】:

      您可以在原始数组上使用reduce,然后在每年的values 上调用reduce,获取按年份划分的销售和订单报告。

      例如:

      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())

      您可以通过将month.revenue 替换为month.orders 来对订单执行相同的操作。您也可以让函数接受 year 参数,然后只报告那一年,但如果您每年都在页面上报告,那么只循环一次可能是有意义的。

      【讨论】:

      • 谢谢。我看到了reduce函数是如何工作的,但是如果我把这个逻辑放到计算函数中,当totalOrderstotalRevenue被渲染出来时(多次,每年一次循环),一年中的每次迭代都不会调用它)?由于这些计算值在年份循环中,我希望至少能够在计算函数中根据上下文获取当前年份,这样逻辑就不必每次都减少所有年份。
      • 使用方法而不是计算函数是否会更好,并在循环中将当前年份传递给该方法?我是 Vue 的新手,因此对整体最佳方法的建议持开放态度。
      • @Dan 我可能会将此作为一种方法,并将当前年份作为参数。如果您认为需要多次调用它,您还可以将总计缓存为报表上的属性。如果你走那条路,你甚至可以在从 api 接收数据时计算一次总数。
      【解决方案3】:

      你可以试试这个。

      var array = [
        {name: "Peter", age: 43},
        {name: "John", age: 32},
        {name: "Jake", age: 21}
      ];
      
      array.reduce(function(sum, current) {
        return sum + current.age;
      }, 0); // 43 + 32 + 21 = 96
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-04
        • 2018-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-21
        • 2022-11-06
        • 2021-12-17
        相关资源
        最近更新 更多