Уменьшить функцию, возвращающую NaN при извлечении объекта из массива — база данных MongoDB, интерфейс React

#javascript #reactjs #mongodb

#javascript #reactjs #mongodb

Вопрос:

У меня есть следующая схема:

 const SubmitDebtSchema = new Schema ({
  balance: [{
    balanceDate: Date,
    newBalance: Number
  }],
});
 

Я пытаюсь перебрать записи в своей базе данных, извлечь ‘newBalance’ из каждого объекта в массиве balance, а затем уменьшить / суммировать их вместе.

Однако он возвращает ‘NaN’ — и я не могу понять, почему.

Вот мой вызов Axios для получения данных:

   componentDidMount() {

    axios.get("/api/fetch/fetchDebtCards")
    .then((response) => {
      this.setState({
        debts: response.data
      })
      console.log(this.state.debts.balance.newBalance)
    })
  }
 

Вход в консоль успешно извлекает записи базы данных.

И вот моя функция уменьшения:

 const sumBalance = this.state.debts.reduce(function(previousValue, currentValue) {
          return (
            previousValue   currentValue.balance.newBalance
          )
        }, 0)
 

Вы можете видеть, я пытаюсь подключиться к ‘balance.newBalance’, чтобы получить доступ к newBalance в каждом из объектов баланса.

Может кто-нибудь указать, что я делаю неправильно?

РЕДАКТИРОВАТЬ: мой журнал консоли с двумя записями. Что я хочу сделать, это получить из них массив newBalance array.length -1 и суммировать их вместе путем уменьшения.

[Журнал] Массив

0 Объект

баланс: [{_id: «5fbbddd1077c56000828973c», balanceDate: «2020-11-23T16:05:36.124Z», новый баланс: 400}]

1 объект

баланс: [{_id: «5fbc06f58b2f98000865df54», balanceDate: «2020-11-23T19:01:07.789Z», newBalance: 300}] (1)

Комментарии:

1. если currentValue.balance.newBalance в нем есть NaN, вы получите NaN в результате сокращения. Возможно, попробуйте вернуть константу «1» в инструкции retrun, чтобы либо исключить, либо исключить это как потенциальную причину

2. В каждой записи есть цифры, они должны быть. Так что это будет потому, что он не извлекает записи.

3. this.state.debts должен быть массив, чтобы вы могли использовать reduce. но после вашей консоли. регистрируйте, что это не массив

Ответ №1:

если «console.log (this.state.debts.balance.newBalance)» работает, то долги — это не массив, как тогда вы используете map для долгов? Карта может использоваться только для массивов.

Я не уверен, как именно выглядит ваш объект / массив debts. Возможно, журнал этого был бы полезен.

Если это массив, то это может сработать.

 const sumBalance = this.state.debts.map(x => x.balance).flat().reduce((a,b) => a   b.newBalance, 0)
 

принимая во внимание, что если это объект, то это может сработать

 const sumBalance = this.state.debts.balance.reduce((a,b) => a b.newBalance, 0)
 

Если ничего из этого не сработает, просто запишите «this.state.debts» и дайте нам посмотреть, что у вас там есть.

Редактировать: Хорошо, значит, вам нужны только последние значения массивов баланса (последний баланс), что-то вроде этого?

 const sumBalance = this.state.debts.map(x => x.balance[x.balance.length-1].newBalance).reduce((a,b) => a   b, 0)
 

Комментарии:

1. Привет, я обновлю свой исходный пост с помощью моего консольного журнала… Первый из них не сработал — решающий момент в том, что я пытаюсь уменьшить не массивы ‘newBalance’, а все балансы и, в частности, newBalance внутри них, если это имеет смысл?

2. Я добавил его сейчас.

3. Ну, в соответствии с вашей структурой, первый ответ должен сработать, какой результат он вам дает?

4. Ладно, кажется, я все понял… И это моя вина. Итак, «баланс» — это массив объектов. Ваша первая функция возвращает 3000 — это прогресс, но на самом деле я хочу извлечь последнюю цифру из массива баланса и сделать это для всех моих записей в базе данных; затем суммируйте их вместе. Я извлек массив значений из каждого журнала; так как в каждом из них было 7/8. Так что это было бы что-то вроде x.balance[баланс. длина — 1] Я думаю…

5. Рабочая точка после редактирования. Большое спасибо за вашу помощь!