首页 > 解决方案 > 有效地求和不同的值

问题描述

我有一个包含这样的对象的数组:

[
  {
    "id": 91,
    "factor": 2,
    "title": "Test Product",
    "price": 50,
    "interval": 1,
    "setup": 0,
    "optional": false
  },
  {
    "id": 92,
    "factor": 1,
    "title": "Another Test Product",
    "price": 95,
    "interval": 1,
    "setup": 99,
    "optional": true
  },
  {
    "id": 93,
    "factor": 1,
    "title": "Just Another Test Product",
    "price": 12,
    "interval": 1,
    "setup": 0,
    "optional": false
  }
]

好的 - 现在我想创建一个总和:

现在我为每个任务使用计算值:

setupTotal: function () {
            return this.products.reduce ((acc, product) => acc + (parseFloat (product.setup) * parseFloat (product.factor)), 0);
        },

monthlyCostsTotal: function () {
            let sum = 0;
            this.products.forEach (function (product) {
                if (product.interval == 1) {
                    sum += (parseFloat (product.price) * parseFloat (product.factor));
                }
            });
            return sum;
        },

setupOptional: function () {
    let sum = 0;
    this.products.forEach (function (product) {
        if (product.optional) {
            sum += (parseFloat (product.setup) * parseFloat (product.factor));
        }
    });

    return sum;
},

但这当然不是最佳的,因为我一遍又一遍地循环遍历数组。

所以我的问题是:如何创建一种更有效的方法来对值求和:

标签: javascriptvue.jsvuejs2

解决方案


您可以根据需要取一个对象并求和。

var data = [{ id: 91, factor: 2, title: "Test Product", price: 50, interval: 1, setup: 0, optional: false }, { id: 92, factor: 1, title: "Another Test Product", price: 95, interval: 1, setup: 99, optional: true }, { id: 93, factor: 1, title: "Just Another Test Product", price: 12, interval: 1, setup: 0, optional: false }],
    result = data.reduce((r, { factor, price, interval, setup, optional }) => {
        r.price += factor * price;
        r.setup += factor * setup;
        if (optional) {
            r.price_optional += factor * price;
            r.setup_optional += factor * setup;
        }
        r.interval[interval] = (r.interval[interval] || 0) + factor * price;
        return r;
    }, { price: 0, price_optional: 0, setup: 0, setup_optional: 0, interval: {} });

console.log(result);


推荐阅读