Использование циклов for только для перебора массива объектов с другими массивами

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 только для перебора каждой учетной записи (объекта) и добавления всех элементов депозитов и всех элементов снятия средств, затем мне нужно вычесть снятие средств из депозита и посмотреть, равен ли он ключу баланса значение пары счетов (объект). Я застреваю в своем коде, когда могу добавить только все элементы массива депозитов и выводов. Я не знаю, как поступить. Я просто возился и пробовал разные блоки кода. Но я не могу понять, что делать.

Почему можно только их добавить? просто вычесть снятие средств, а не добавить их? sum -= numWith; а потом сравните с балансом const result = sum === obj.balance;

pilchard 20.02.2023 23:05
Руководство для начинающих по веб-разработке на React.js
Руководство для начинающих по веб-разработке на React.js
Веб-разработка - это захватывающая и постоянно меняющаяся область, которая постоянно развивается благодаря новым технологиям и тенденциям. Одним из...
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
Интервьюер: Почему '[] instanceof Object' возвращает "true"?
Интервьюер: Почему '[] instanceof Object' возвращает "true"?
Все мы знаем, что [] instanceof Array возвращает true, но почему [] instanceof Object тоже возвращает true?
Абстрактное синтаксическое дерево (AST) и как оно работает с ReactJS
Абстрактное синтаксическое дерево (AST) и как оно работает с ReactJS
Абстрактное синтаксическое дерево (AST) - это древовидная структура данных, которая представляет структуру и иерархию исходного кода на языке...
2
1
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий
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)) и смог решить то, что мне было нужно.

OldsoulPhil 20.02.2023 23:47

Вы правы, спасибо. Обновлено.

James Risner 20.02.2023 23:49

Я думаю, что лучшим решением будет if (obj.balance - dsum + wsum < Number.EPSILON). Никогда не рекомендуется сравнивать результат суммы. И вообще, JavaScript и числа с плавающей запятой не должны использоваться для учета :)

Christian Vincenzo Traina 20.02.2023 23:50

Типичный пример: balance: 0.3, deposits: [0.1, 0.2], это приведет к неправильному балансу, если он не

Christian Vincenzo Traina 20.02.2023 23:52

@ChristianVincenzoTraina Спасибо за подсказку Number.EPSILON

James Risner 21.02.2023 00:39

Использование 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)

Другие вопросы по теме