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/
  • Вопрос задан
  • 1116 просмотров
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
Одна валюта:

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

Все:

arr.reduce((acc, n) => {
  const [ , currency, sum ] = n.match(/(\w+) (\d+)/);
  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 = ..
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@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);
Ответ написан
@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;
}
Ответ написан
Ваш ответ на вопрос

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

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