Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Сравнение данных при переборе (https://javascript.ru/forum/events/85217-sravnenie-dannykh-pri-perebore.html)

ureech 17.05.2023 09:31

Сравнение данных при переборе
 
Привет.
<div class="group">
	<div data-cost="0" class="item">1</div>
	<div data-id="id" data-cost="10" class="item">2</div>
	<div data-cost="20" class="item">3</div>
</div>
<div class="group">
	<div data-cost="0" class="item">1</div>
	<div data-cost="30" class="item">2</div>
	<div data-cost="40" class="item">3</div>
</div>
<div class="group">
	<div data-cost="0" class="item show">4</div>
	<div data-cost="50" data-id="id" class="item show">5</div>
	<div data-cost="60" class="item show">6</div>
</div>


Подскажите, как при переборе всех item получить data-cost, при условии что data-id равны? В данном примере это data-cost="10"

Я пытался сделать как то так
$('.item').each(function(i, el) {
var link = el.dataset.id
if(link){
if(el.classList.contains('show')){
var a = el
}else{
vat b = el
}
//Но при попытке 
if(a.dataset.id == b.dataset.id)
// получаю ошибку, что а-нет
}
})

рони 17.05.2023 15:15

ureech,
<!DOCTYPE HTML>

<html>

<head>
  <title>Untitled</title>
  <meta charset="utf-8">
</head>

<body>

<div class="group">
	<div data-cost="0" class="item">1</div>
	<div data-id="id" data-cost="10" class="item">2</div>
	<div data-cost="20" class="item">3</div>
</div>
<div class="group">
	<div data-cost="0" class="item">1</div>
	<div data-cost="30" class="item">2</div>
	<div data-cost="40" class="item">3</div>
</div>
<div class="group">
	<div data-cost="0" class="item show">4</div>
	<div data-cost="50" data-id="id" class="item show">5</div>
	<div data-cost="60" class="item show">6</div>
</div>
<script>
let id = 'id';
let sel = `[data-id="${id}"]`;
let num = [...document.querySelectorAll(sel)].reduce((sum, {dataset : {cost}})=> sum + +cost, 0);
alert(num);
</script>
</body>

</html>

ureech 18.05.2023 07:43

Не то. Нужно получить
Цитата:

Сообщение от ureech
В данном примере это data-cost="10"

А у вас 60.
К тому же внутри $('.item').each(function(i, el) { не хочет работать. А нужно именно при переборе.

рони 18.05.2023 07:52

Цитата:

Сообщение от ureech
А у вас 60.

Цитата:

Сообщение от ureech
<div data-id="id" data-cost="10"

+
Цитата:

Сообщение от ureech
<div data-cost="50" data-id="id"

= 60

ureech 18.05.2023 08:13

Да и не в цикле тоже не работает). Тут
let sel = `[data-id="${id}"]`;

у меня должна быть длинная строка из чисел и букв, а по факту вижу какие то три числа.

ureech 18.05.2023 08:14

Цитата:

Сообщение от рони (Сообщение 551898)
+ = 60

Это то я вкурил)

рони 18.05.2023 08:15

ureech,
<!DOCTYPE HTML>
<html>
<head>
    <title>Untitled</title>
    <meta charset="utf-8">
</head>
<body>
    <div class="group">
        <div data-cost="0" class="item">1</div>
        <div data-id="id" data-cost="10" class="item">2</div>
        <div data-cost="20" class="item">3</div>
    </div>
    <div class="group">
        <div data-cost="0" class="item">1</div>
        <div data-cost="30" class="item">2</div>
        <div data-cost="40" class="item">3</div>
    </div>
    <div class="group">
        <div data-cost="0" class="item show">4</div>
        <div data-cost="50" data-id="id" class="item show">5</div>
        <div data-cost="60" class="item show">6</div>
    </div>
    <script>
        let items = document.querySelectorAll('.item[data-id]');
        let obj = [...items].reduce((ob, {
            dataset: {
                cost,
                id
            }
        }, i) => {
            let ar = ob[id];
            if (!ar) ob[id] = ar = [cost];
            else {
                ar.push(cost);
                let txt = `Что вам нужно я не понимаю, но есть ${ar.length} элемента с id = ${id} с cost = ${ar}`
                alert(txt)
            }
            return ob
        }, {});
    </script>
</body>
</html>

ureech 18.05.2023 08:24

Ок,спасибо.Суть я понял.Буду колдовать)

ureech 18.05.2023 08:55

Ещё вопрос). На выходе я имею массив. А как получить объект? Или что то типа того. Так как при таком раскладе работает только с одной парой значений. Если data-id не два, а четыре(две пары), то выводит только последнию.

рони 18.05.2023 09:36

ureech,
предложенный выше код выводит все совпадения в виде объекта, какой код у вас, не знаю.
пишите что на входе, что хотите получить на выходе.

рони 18.05.2023 10:11

ureech,
<!DOCTYPE HTML>
<html>
<head>
    <title>Untitled</title>
    <meta charset="utf-8">
</head>
<body>
    <div class="group">
        <div data-cost="0" class="item">1</div>
        <div data-id="id" data-cost="10" class="item">2</div>
        <div data-cost="20" class="item">3</div>
    </div>
    <div class="group">
        <div data-cost="0" class="item">1</div>
        <div data-cost="30" class="item" data-id="id">2</div>
        <div data-cost="40" class="item" data-id="test">3</div>
    </div>
    <div class="group">
        <div data-cost="0" class="item show">4</div>
        <div data-cost="50" data-id="id" class="item show">5</div>
        <div data-cost="60" class="item show" data-id="test">6</div>
    </div>
    <script>
        let items = document.querySelectorAll('.item[data-id]');
        let result = {};
        let obj = [...items].reduce((ob, {
            dataset: {
                cost,
                id
            }
        }, i) => {
            let ar = ob[id];
            if (!ar) ob[id] = ar = [cost];
            else {
                ar.push(cost);
                result[id] = ar;
            }
            return ob
        }, {});
       document.write(JSON.stringify(result))
    </script>
</body>
</html>

ureech 18.05.2023 10:15

На входе у меня объект.
let list = $('.pubmods__mods-list__item');

Object { 0: div.pubmods__mods-list__item, 1: div.pubmods__mods-list__item, 2: div.pubmods__mods-list__item, 3: div.pubmods__mods-list__item, 4: div.pubmods__mods-list__item, 5: div.pubmods__mods-list__item.show-always, 6: div.pubmods__mods-list__item.show-always, 7: div.pubmods__mods-list__item.show-always, 8: div.pubmods__mods-list__item.show-always, 9: div.pubmods__mods-list__item.show-always, … }

далее этот объект периберается

list.each(function(i, el) {
//тут идут разные вычисления с параметрами el. 
//И мне надо тут проверять, есть ли элементы с одинаковыми dataset.id. Плюс dataset.id может и не быть.  И если есть получать их dataset.cost. И эти dataset.cost будут подставляться в вычисления.
})

ureech 18.05.2023 10:19

Вот напроимер dataset
dataset: DOMStringMap(5) { costPrefix → "+", modifImg → "/images/modificators/razmer.jpg", modifName → "120х200", … }
costPrefix: "+"
linkId: "07cd4e627e93c535a342a195a6da523285efffbc3c671044"
modifCost: "15000"
modifImg: "/images/modificators/razmer.jpg"
modifName: "120х200"

рони 18.05.2023 10:24

ureech,
let objId = {};
        list.each(function(i, el) {
            //тут идут разные вычисления с параметрами el.
            //И мне надо тут проверять, есть ли элементы с одинаковыми dataset.id. Плюс dataset.id может и не быть.  И если есть получать их dataset.cost. И эти dataset.cost будут подставляться в вычисления.
            let id = el.dataset.id;
            if (id) {
                let ar = objId[id];
                if (!ar) ar = objId[id] = [];
                ar.push(el);
                if (ar.length > 1) {
                    // есть совпадения, что-то делаем
                }
            }
        })

ureech 18.05.2023 10:25

Цитата:

Сообщение от рони
result[id] = ar;

Наверное так, уже что то у меня и получится). Буду пробовать.Спасибушки)


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