Цикл по массиву объектов, фильтрация в зависимости от того, находится ли дата в текущем месяце

#javascript #reactjs

#javascript #reactjs

Вопрос:

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

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

Затем у меня есть интерфейс React, который инициирует пустой массив и устанавливает ответ как состояние:

 this.state = {
      debts: []
    }
 

Затем я хочу отфильтровать этот массив, и если CreditCard === true, сохраните их в переменной:

   const creditCards = this.state.debts.filter((x) => { return x.creditCard === 'true' })
 

Затем я сопоставляю каждый из оставшихся объектов в массиве, извлекаю их объект «баланс» и сохраняю их в другой переменной:

 const databaseBalance = creditCards.map(x => x.balance)
 

Если я консольный журнал databaseBalance, это вывод:

[[{_id: «5fc4aa02959b1409f2edab69», Новый баланс: 300, дата баланса: «2020-11-30T08:14:58.035Z»}, {_id: «5fc51cb0bd4d9a0f6059bdbe», Новый баланс: 400, Дата баланса: «2020-11-30T16:24:14.390Z»}]]

Затем я хочу просмотреть каждую из записей balanceDate, сравнить их с определенным месяцем (текущий месяц, затем текущий месяц — 1, текущий месяц — 2 и так далее), А затем сохранить их в следующей переменной:

 const currentMonthValues = []
const currentMonthValuesMinusOne = []
const currentMonthValuesMinusTwo = []
 

Для справки, записи balanceDate хранятся как объекты date, например:

2020-11-30T08:14:58.035Z

Записи, хранящиеся в пустом currentMonthValue, должны быть полными объектами — и по-прежнему содержать данные ‘newBalance’ и так далее.

Мой вопрос… Как мне это сделать? Я ломаю голову над тем, как это сделать, но ни за что на свете не могу в этом разобраться.

Надеюсь, все вышесказанное понятно, пожалуйста, скажите, если у вас есть вопросы.

РЕДАКТИРОВАТЬ: теперь у меня есть решение … мне просто нужно уменьшить цифры до общего числа.

Вот рабочая функция:

 const currentMonthCreditArray = creditCards.flatMap(x => x.balance.filter(y => (new Date(y.balanceDate).getMonth() === new Date().getMonth())))
 

Что мне теперь нужно сделать, так это взять каждый «новый баланс» из этого массива и свести их к общей цифре.

Я попробовал что-то вроде этого…

 const currentMonthFinal = currentMonthCreditArray.flatMap(x => x.balance.map(y => y.newBalance.reduce((a,b) => a   b, 0)))
 

Но это приводит к ошибкам. Какие-либо указатели?

Ответ №1:

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

 const currentMonth = creditCards.map((x) => {
  return { ...x, balance: x.balance.filter((y) => new Date().getMonth() - new Date(y.balanceDate).getMonth() <= 1) };
}).filter(i => i.balance.length);


const lessOneMonth = creditCards.map((x) => {
  return { ...x, balance: x.balance.filter((y) => new Date().getMonth() - new Date(y.balanceDate).getMonth() <= 2) };
}).filter(i => i.balance.length);


 

Фильтры даты, вероятно, не совсем то, что вам нужно, но вы должны понять идею.


Я люблю функциональное программирование, но это выше будет делать много циклов. Если эти массивы большие, это может быть не лучшим решением. В этом случае посмотрите на Array.reduce() или старый добрый Array.push()

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

1. Спасибо, я чувствую, что это близко….. Но я не думаю, что это работает так, как ожидалось — он не отфильтровывает ни один из них. Можете ли вы объяснить, что делает каждая часть, и ‘<= 1’ в конце?

2. Да, как уже упоминалось, фильтр по дате, вероятно, не совсем то, что вам нужно. Date.getMonth() возвращает дату в виде int. Итак, мы видим, сколько месяцев разницы между вашей датой и текущей датой. Если разница составляет менее 1 месяца, менее 2 месяцев и т.д..

3. обновлен ответ @JonNicholson, который может лучше соответствовать вашим потребностям. Также порядок моих аргументов даты был неправильным. Теперь он должен фильтровать

4. Спасибо вам за это. Оригинал был ближе — ему просто нужно было ‘- 1’, ‘- 2’ и т.д. в конце вместо ‘<= 1’ и так далее. Я принял ваш ответ, но мог бы дать немного больше советов, если вы захотите помочь? Теперь у меня есть массивы, мне просто нужно уменьшить их до общей цифры! Если я обновлю исходный вопрос, не могли бы вы помочь?

5. @JonNicholson да, конечно, попробую помочь. Я думаю, что в этот момент вы должны просто иметь возможность использовать: currentMonthCreditArray.reduce((a,b) => a.newBalance b.newBalance, 0) после flatMap массив должен иметь глубину только 1 уровень — так что не пытайтесь chain .flatMap().map().reduce() — для этого потребуется 3 уровня массивов