Почему эта рекурсивная функция перезаписывает значения второго вызова?

«Include» используется для расширения базового варианта использования и является обязательным условием, то есть включенный запуск использования должен выполняться успешно, чтобы завершить базовое использование.

, например. Рассмотрим случай службы электронной почты, здесь «Логин» является включенным прецедентом, который должен быть запущен для отправки электронной почты (базовый вариант использования)

«Исключить», с другой стороны, является необязательным вариантом использования, который расширяет базовый вариант использования, базовый прецедент может успешно работать даже без вызова / вызова расширенного варианта использования.

например Рассмотрите возможность покупки ноутбука в качестве базового варианта использования и «Дополнительную гарантию» в качестве продления срока использования, здесь вы можете запустить базовый вариант «Покупка ноутбуков», даже не беря дополнительную гарантию.

0
задан RobertAB 2 March 2019 в 09:23
поделиться

1 ответ

Проблема в том, что начальное значение вашего 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']));

0
ответ дан CertainPerformance 2 March 2019 в 09:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: