const bankAccounts = [
{
id: 1,
name: "Susan",
balance: 100.32,
deposits: [150, 30, 221],
withdrawals: [110, 70.68, 120],
},
{ id: 2, name: "Morgan", balance: 1100.0, deposits: [1100] },
{
id: 3,
name: "Joshua",
balance: 18456.57,
deposits: [4000, 5000, 6000, 9200, 256.57],
withdrawals: [1500, 1400, 1500, 1500],
},
{ id: 4, name: "Candy", balance: 0.0 },
{ id: 5, name: "Phil", balance: 18, deposits: [100, 18], withdrawals: [100] },
];
function getClientsWithWrongBalance(bankAccounts) {
const newArray = [];
for (let obj of bankAccounts) {
let sum = 0;
if (obj.deposits) {
for (let numDep of obj.deposits) {
sum += numDep;
}
}
if (obj.withdrawls) {
for (let numWith of obj.withdrawls) {
sum += numWith;
}
}
}
return newArray;
}
У меня есть пять банковских счетов (объектов) в переменной bankAccounts (массив). То, что я пытаюсь сделать, это использовать циклы for только для перебора каждой учетной записи (объекта) и добавления всех элементов депозитов и всех элементов снятия средств, затем мне нужно вычесть снятие средств из депозита и посмотреть, равен ли он ключу баланса значение пары счетов (объект). Я застреваю в своем коде, когда могу добавить только все элементы массива депозитов и выводов. Я не знаю, как поступить. Я просто возился и пробовал разные блоки кода. Но я не могу понять, что делать.
function getClientsWithWrongBalance(bankAccounts) {
const newArray = [];
for (let obj of bankAccounts) {
let dsum = 0;
let wsum = 0;
if (obj.deposits) {
for (let numDep of obj.deposits) {
dsum += numDep;
}
}
if (obj.withdrawals) {
for (let numWith of obj.withdrawals) {
wsum += numWith;
}
}
if (Math.abs(obj.balance - dsum + wsum) > Number.EPSILON) {
newArray.push(obj);
}
}
return newArray;
}
Суммарные депозиты и снятия отдельно, сравните с балансом и сохраните любые различия в возвращаемом массиве.
Как упоминалось в комментариях, плавающая точка небезопасна для денег. Вы можете более безопасно представлять деньги, сохраняя их в виде целых чисел и разделяя для отображения. Например. за 100 долларов США хранить как 10000 и /100 распечатать.
Так что это правильно. Вместо этого в последнем операторе if я использовал obj.balance != (dsum - wsum)) и смог решить то, что мне было нужно.
Вы правы, спасибо. Обновлено.
Я думаю, что лучшим решением будет if (obj.balance - dsum + wsum < Number.EPSILON). Никогда не рекомендуется сравнивать результат суммы. И вообще, JavaScript и числа с плавающей запятой не должны использоваться для учета :)
Типичный пример: balance: 0.3, deposits: [0.1, 0.2], это приведет к неправильному балансу, если он не
@ChristianVincenzoTraina Спасибо за подсказку Number.EPSILON
Использование Number.EPSILON, чтобы избежать проблем с плавающей запятой, кредит Кристиану
const bankAccounts = [{"id":1,"name":"Susan","balance":100.32,"deposits":[150,30,221],"withdrawals":[110,70.68,120]},{"id":2,"name":"Morgan","balance":1100,"deposits":[1100]},{"id":3,"name":"Joshua","balance":18456.57,"deposits":[4000,5000,6000,9200,256.57],"withdrawals":[1500,1400,1500,1500]},{"id":4,"name":"Candy","balance":0},{"id":5,"name":"Phil","balance":18,"deposits":[100,18],"withdrawals":[100]}]
const r = bankAccounts.filter(({deposits:d=[],withdrawals:w=[],balance:b})=>
Math.abs([...d, ...w.map(i=>-i), -b].reduce((a,b)=>a+b))>Number.EPSILON)
console.info(r)
Почему можно только их добавить? просто вычесть снятие средств, а не добавить их? sum -= numWith; а потом сравните с балансом const result = sum === obj.balance;