#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 уровня массивов