Zheleznov
@Zheleznov

Как решить задачку с массивами на js?

Привет всем!
Изучаю js, помогите пожалуйста решить задачку, направьте, не понимаю что делаю не так..

Есть массив с названием валюты и суммой денег, нужно при выборе валюты, вывести сумму всех денег одной валюты
Т.е. например для доллара мы должны получить usd 1 + usd 10 + usd 5 = 16

const money = ['eur 10', 'usd 1', 'usd 10', 'rub 50', 'usd 5'];

const itog = (arr) => {

for(let i=0; i < arr.lenght; i++) {
    if (arr[i].slice(0,3) === 'usd') {
      result += arr[i]
      return result
    }
}
}
console.log(itog(money));


Тут я примерно понимаю что по сути он будет складывать строки, из которых надо будет вырезать валюту и пробел, перевести в number и потом сложить

Но функция уже на этом этапе выдаёт undefined

https://jsfiddle.net/Zhelezniy/dojc4m19/2/
  • Вопрос задан
  • 1909 просмотров
Решения вопроса 4
0xD34F
@0xD34F Куратор тега JavaScript
Одна валюта:

arr.reduce((acc, n) => acc + +(n.startsWith(`${currency} `) && n.match(/\d+$/)), 0)

Все:

arr.reduce((acc, n) => {
  const [ currency, sum ] = n.split(' ');
  acc[currency] = (acc[currency] ?? 0) + +sum;
  return acc;
}, {})
Ответ написан
lugindev
@lugindev
Undefined, т.к. переменная result у вас нигде не объявлена.
Строки нужно приводить к числам для сложения
const money = ['eur 10', 'usd 1', 'usd 10', 'rub 50', 'usd 5']

// Нужно объявить переменную, к которой суммировать
let summ = 0

for(let i = 0; i < money.length; i++) {
	// Разобьем строку по пробелу
	// 'eur 10' => ['eur', '10']
	const parts = money[i].split(' ')
  if (parts[0] === 'usd') {
  	// parts[1] это строка, нужно привести к числу
		// parseInt(parts[1]) или короткая запись +parts[1]
  	summ += +parts[1]
  }
  
  // Условие можно записать в 1 строку
	// if (parts[0] === 'usd') summ += +parts[1]

	// Или даже так:
	// parts[0] === 'usd' && (summ += +parts[1])
}

console.log(summ)


https://jsfiddle.net/1u65epLk/
UPD: и не пишите транслитом) const itog = ..
Ответ написан
salo_v_bokah
@salo_v_bokah
ломаю main-ветки, не дорого
Просто и логично, как по мне:
const money = ['eur 10', 'usd 1', 'eur 5', 'rub 100', 'usd 20', 'eur 100', 'rub 200'];

const getTotalAmount = (arr, curr) => {    //объявляем ф-цию с параметрами массив (array) и валюту (currency)
  let result = 0;                                         //объявляем счетчик
  for (const item of arr) {                          // перебираем массив
    if (curr === item.slice(0, 3)) {               
    // условие: если указанный курс равен элементу массива, который порезан с 0 - 3 индекс, то 
      result += Number(item.slice(4, item.length));    
    //прибавляем к счетчику что осталось до конца элемента, преобразовав через Number строку в число
    }
  }
  return result;    //возвращаем что получилось
};

console.log(getTotalAmount(money, "usd"));
Ответ написан
Комментировать
@an22alt
наверное так будет универсальнее)
const money = ['eur 10', 'usd 1', 'usd 10', 'rub 50', 'usd 5']
let res = new Map()

for (var i=0, len=money.length; i<len; i++) {
    let valuta = money[i].split(' ')
    
    if(res.has(valuta[0])){
      let price = res.get(valuta[0])
      res.set(valuta[0], price + Number(valuta[1]))
    }
    else{
      res.set(valuta[0], Number(valuta[1]))
    }
}

console.log(res);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@vi_k
arr.reduce((acc, el) => {
    const [cur, sum] = el.split(' ');
    acc[cur] = (acc[cur] || 0) + +sum;
    return acc;
  }, {});


или

function sumMoney(arr) {
  let acc = {};
  arr.forEach((el) => {
    const [cur, sum] = el.split(' ');
    acc[cur] = (acc[cur] || 0) + +sum;
  });

  return acc;
}
Ответ написан
Комментировать
я решил эту задачку следующим способом.
Я понимаю что здесь много кода, но я решил ее самостоятельно)
const data = [
  'eur 10', 'rub 50', 'eur 5', 'rub 10', 'rub 10', 'eur 100', 'rub 200',
];
const money1 = [
  'eur 10', 'usd 1', 'usd 10', 'rub 50', 'usd 5',
];
const money2 = [
  'eur 10', 'usd 1', 'eur 5', 'rub 100', 'eur 20', 'eur 100', 'rub 200',
];

const getTotalAmount = (items, currency) => {
  let arrays = [];
  const a = [];
  let sum = 0;

  for(const item of items) {
    const val = item.slice(0,3);
    if(val === currency) {
      arrays.push(item);
    }
  }

  const res = arrays.map(el => {
    const newValue = el.split(' ');
    for(let i = 0; i < newValue.length; i++) {
      let digit = parseInt(newValue[i]);
      //вместо управляющей инструкции мы сделали это
      if(!isNaN(digit)) {
        a.push(newValue[i]);
      }
    }
  });

  for(const el of a) {
    sum += +el
  }
  return sum;
};

console.log(getTotalAmount(data, 'rub'));
console.log(getTotalAmount(money1, 'usd'));
console.log(getTotalAmount(money2, 'eur'));
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы