Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Вернуть сумму значений в объекте (https://javascript.ru/forum/misc/84125-vernut-summu-znachenijj-v-obekte.html)

NovichokJS 07.06.2022 10:33

Вернуть сумму значений в объекте
 
Есть объект:

const objCars = {

    'reno': '$15000',
    'audi': '$20000',
    'bmw': '$30000',
    'peogeot': '18000$'
}


Мне нужно получить сумму всех цен на авто. Решил таким образом:

const sumOfPrice = obj => {

    let sum = 0;

    for (let key in obj) {
        let str = obj[key].replace(/\D+/g, '');
        sum += Number(str);
    }
    return sum;

}


Но мне кажется что можно было проще решить. Пытался применить методы превращения строки в число, однако, например Number.parseInt() не отбросил лишние символы с obj[key]. Можно ли?

ksa 07.06.2022 10:48

NovichokJS, знак доллара у тебя будет в разных местах?

Обозначение валюты вообще лучше выводить в отдельный ключ...
Сумма должна быть суммой.

ksa 07.06.2022 10:53

Цитата:

Сообщение от NovichokJS
Можно ли?

Например так...
const obj = {
    'reno': '$15000',
    'audi': '$20000',
    'bmw': '$30000',
    'peogeot': '18000$'
}
const s = Object.values(obj).reduce((val, el) => val += +el.match(/\d+/)[0], 0)
alert(s)

NovichokJS 07.06.2022 10:54

Цитата:

Сообщение от ksa (Сообщение 545983)
NovichokJS, знак доллара у тебя будет в разных местах?

Обозначение валюты вообще лучше выводить в отдельный ключ...
Сумма должна быть суммой.

Ну здесь суть такая что принимаю данные уже в таком фармате и надо исходить от этого

ksa 07.06.2022 10:55

NovichokJS, я свой вариант показал выше... ;)

NovichokJS 07.06.2022 10:55

Цитата:

Сообщение от ksa (Сообщение 545984)
Например так...
const obj = {
    'reno': '$15000',
    'audi': '$20000',
    'bmw': '$30000',
    'peogeot': '18000$'
}
const s = Object.values(obj).reduce((val, el) => val += +el.match(/\d+/)[0], 0)
alert(s)

а без регулярки можно обойтись?

Дмитрий Луценко 07.06.2022 11:14

Цитата:

Сообщение от NovichokJS (Сообщение 545987)
а без регулярки можно обойтись?

Я думаю, это надо заморачиваться с parseInt() - сработает только в случае 1000$.
2-й способ: читать все символы, если символ не число, то отбраковывать.

ksa 07.06.2022 11:15

Цитата:

Сообщение от NovichokJS
а без регулярки можно обойтись?

Для этого нужно понимать где будут символы валюты...
Поняв где они - просто "вырезать" циферки, перевести их в число.

ksa 07.06.2022 11:16

Цитата:

Сообщение от Дмитрий Луценко
2-й способ: читать все символы, если символ не число, то отбраковывать

Ну это вовсе не эффективно. :nono:

Дмитрий Луценко 07.06.2022 11:21

Цитата:

Сообщение от ksa (Сообщение 545990)
Ну это вовсе не эффективно. :nono:

Конечно не оптимизированно) Тем более, есть необходимые для этого функции и способы) Слайсинг, к примеру)

ksa 07.06.2022 11:25

Дмитрий Луценко, как вариант...
const obj = {
    'reno': '$15000',
    'audi': '$20000',
    'bmw': '$30000',
    'peogeot': '18000$'
}
const s = Object.values(obj).reduce((val, el) => val += value(el), 0)
alert(s)
// Вернет число
function value(str) {
	const i = str.indexOf('$')
	if (i === -1) return +str
	return +(i ? str.substring(0, i) : str.substring(1))
}

NovichokJS 07.06.2022 11:27

ок, спасибо ребята!

рони 07.06.2022 11:39

:) :write:
<script src="https://cdnjs.cloudflare.com/ajax/libs/collect.js/4.34.0/collect.min.js"></script>
    <script>
        const objCars = {
            'reno': '$15000',
            'audi': '$20000',
            'bmw': '$30000',
            'peogeot': '18000$'
        }

        const total = collect(objCars).sum(value => value.replace(/\D+/g, ''));
        alert(total);
    </script>

NovichokJS 07.06.2022 12:10

Цитата:

Сообщение от рони (Сообщение 545995)
:) :write:
<script src="https://cdnjs.cloudflare.com/ajax/libs/collect.js/4.34.0/collect.min.js"></script>
    <script>
        const objCars = {
            'reno': '$15000',
            'audi': '$20000',
            'bmw': '$30000',
            'peogeot': '18000$'
        }

        const total = collect(objCars).sum(value => value.replace(/\D+/g, ''));
        alert(total);
    </script>

мощно) но тут сторонний скрипт подключаем


Часовой пояс GMT +3, время: 05:46.