«Include» используется для расширения базового варианта использования и является обязательным условием, то есть включенный запуск использования должен выполняться успешно, чтобы завершить базовое использование.
, например. Рассмотрим случай службы электронной почты, здесь «Логин» является включенным прецедентом, который должен быть запущен для отправки электронной почты (базовый вариант использования)
«Исключить», с другой стороны, является необязательным вариантом использования, который расширяет базовый вариант использования, базовый прецедент может успешно работать даже без вызова / вызова расширенного варианта использования.
например Рассмотрите возможность покупки ноутбука в качестве базового варианта использования и «Дополнительную гарантию» в качестве продления срока использования, здесь вы можете запустить базовый вариант «Покупка ноутбуков», даже не беря дополнительную гарантию.
Проблема в том, что начальное значение вашего reduce
обратного вызова является первым элементом в массиве values
, а затем вы переходите к назначению этого элемента:
acc[currency]
? (acc[currency] = acc[currency] + cur[currency])
: (acc[currency] = cur[currency]);
Итак, первый элемент получает мутирует каждый раз, когда вызывается sumValues
. Вместо этого укажите пустой объект в качестве начального значения для reduce
:
sumValues = values => {
return values.reduce((acc, cur) => {
for (const currency in cur) {
acc[currency]
? (acc[currency] = acc[currency] + cur[currency])
: (acc[currency] = cur[currency]);
}
return acc;
}, {});
};
sumValues = values => {
return values.reduce((acc, cur) => {
for (const currency in cur) {
acc[currency] ?
(acc[currency] = acc[currency] + cur[currency]) :
(acc[currency] = cur[currency]);
}
return acc;
}, {});
};
totalExpense = expense => {
const values = [];
if (expense['_values']) {
values.push(expense['_values']);
}
const subExpenses = Object.keys(expense).filter(child => {
return child[0] !== '_';
});
if (subExpenses.length > 0) {
for (const subExpense of subExpenses) {
let subtotal = this.totalExpense(expense[subExpense]);
values.push(subtotal);
}
}
if (values.length) {
return this.sumValues(values);
} else {
throw Error('No values in this expense');
}
};
const entertainment = {
_values: {
USD: 23,
AUD: 5,
},
'food & drink': {
_values: {
AUD: 83,
},
'local bar': {
_values: {
AUD: 28,
USD: 2,
},
},
},
minigolf: {
_values: {
USD: 112,
},
},
};
console.log(totalExpense(entertainment));
console.log(totalExpense(entertainment['food & drink']));