Если вы просто хотите уменьшить избыточность ( и предполагаете, что шаблон содержит *), тогда сокращение по массиву значений состояния может работать.
Array :: map возвращает новый массив равной длины, это отношение 1-1. Обратный вызов, используемый с array :: map , также должен быть чистой функцией , что означает, что он имеет ноль побочные эффекты. Сравните это с array :: reduce, который использует чистый обратный вызов функции и возвращает одно значение, например price
, или array :: forEach, который может иметь побочные эффекты в обратном вызове, т.е. он может обновлять внешний price
, но возврат недействителен.
* Шаблон суммирования:
price = SUM[v, i=0_n] v_i ? (i + 1) * 10) : 0
Расчет цены с использованием array :: reduce
const computePrice = values =>
values.reduce((price, value, index) => price + (value ? (index + 1) * 10 : 0), 0);
Использование:
onSubmit(e) {
e.preventDefault();
const price = computePrice(Object.values(this.state));
console.log(price);
}
const computePrice = values =>
values.reduce((price, value, i) => price + (value ? (i + 1) * 10 : 0), 0);
const generalizedData = [
[false], // 0
[true], // 10
[false, true], // 20
[false, true, true], // 50
[true, false, true, false], // 40
[true, true, true, true, true], // 150
[true, true, false, true, true, false, true, false], // 190
];
generalizedData.forEach(state => console.log('price', computePrice(state)));
Расчет цены с использованием array :: forEach
const computePrice = values => {
let price = 0;
values.forEach((value, i) => {
price += value ? (i + 1) * 10 : 0;
});
return price;
};
Использование: То же, что и раньше
const computePrice = values => {
let price = 0;
values.forEach((value, i) => {
price += value ? (i + 1) * 10 : 0;
});
return price;
};
const generalizedData = [
[false], // 0
[true], // 10
[false, true], // 20
[false, true, true], // 50
[true, false, true, false], // 40
[true, true, true, true, true], // 150
[true, true, false, true, true, false, true, false], // 190
];
generalizedData.forEach(state => console.log('price', computePrice(state)));