Эффективно суммируйте различные значения - PullRequest
1 голос
/ 13 апреля 2019

Я получил массив, содержащий такие объекты:

[
  {
    "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
  }
]

Хорошо, теперь я хотел бы создать сумму для:

  • Настройка (всего)
  • Цена (всего)
  • Цена на все товары по интервалам (сгруппировать по 1,2,3,4, ...)

Пока я использую вычисленные значения для каждой задачи:

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;
},

Но, конечно, это не оптимальный вариант, потому что я перебираю массив снова и снова.

Итак, мой вопрос: как я могу создать более эффективный способ суммирования значений по:

  • Цена всего
  • Цена (только по желанию)
  • Всего наладки
  • Настройка (только опционально)
  • Цена по интервалу

Ответы [ 2 ]

1 голос
/ 13 апреля 2019

Вы можете использовать одну вычисляемую функцию и вернуть объект, содержащий результаты:

calcPrice: function () {
    let optional_sum = 0;
    let interval_sum = 0;
    this.products.forEach (function (product) {

        if (product.optional) {
            optional_sum += (parseFloat (product.setup) * parseFloat (product.factor));
        }

         if (product.interval == 1) {
             interval_sum += (parseFloat (product.price) * parseFloat (product.factor));
         }
    });

    return {
         optional : optional_sum ,
         interval : interval_sum
    }
};

Тогда вы можете использовать его как: calcPrice.optional ИЛИ calcPrice.interval

Надеюсь, вы поняли идею.

1 голос
/ 13 апреля 2019

Вы можете взять объект и сумму по мере необходимости.

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...