Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Собрать массив (https://javascript.ru/forum/events/85569-sobrat-massiv.html)

ureech 24.10.2023 14:09

Собрать массив
 
Привет
<div class="slot" data-slot="1" data-age="20" data-sum="50"></div>
<div class="slot" data-slot="2" data-age="30" data-sum="40"></div>
<div class="slot" data-slot="1" data-age="20" data-sum="100"></div>
<div class="slot" data-slot="1" data-age="20" data-sum="70"></div>
<div class="slot" data-slot="2" data-age="30" data-sum="60"></div>


var slot = document.querySelectorAll('.slot')
var Arr = []
slot.forEach(el=>{
Arr.push({
'slot': el.dataset.slot,
'age' : el.dataset.age,
'sum' : el.dataset.sum
})
})

Далее я запоминаю это дело в хранилище и использую в другом месте. Но дело в том, что мне нужны только максимальные data-sum в каждом data-slot, но при этом сам объект с не-максимальными тоже нужен. Как мне это сделать. На входе или выходе, не важно. Но нужно, что бы было как то так

arr = [
{'slot':2,'age':30,'sum':''},
{'slot':1,'age':20,'sum':100},
{'slot':1,'age':20,'sum':''},
{'slot':2,'age':30,'sum':60},
]

Nexus 24.10.2023 14:27

Цитата:

Сообщение от ureech
мне нужны только максимальные

Цитата:

Сообщение от ureech
но при этом сам объект с не-максимальными тоже нужен

Цитата:

Сообщение от ureech
нужно, что бы было как то так *всё-в-куче*

Так что вам в итоге нужно-то и что у вас не получается?

Если у вас дивы только как контейнеры для данных используются, то лучше данные просто как json на страницу выгрузить в теге script с типом text/json.

ureech 24.10.2023 14:41

Цитата:

Сообщение от Nexus
Если у вас дивы только как контейнеры для данных используются, то лучше данные просто как json на страницу выгрузить в теге script с типом text/json.

И что?
Я вставляю данные из массива в элементы,собранные по блокам(слотам)И мне нужны там только максимальные sum в каждом блоке.

ureech 24.10.2023 14:48

var fromStorage = localStorage.getItem('colorRow')
var slots = document.querySelectorAll('.slot:not(.less-today)')
if (fromStorage != null) {
  try {
    var ObgArr = JSON.parse(fromStorage)
    for (var j = 0; j < slots.length; j++) {
      var slot = slots[j]
      ObgArr.forEach((element, index) => {
        if (slot.dataset.slot == element.slot) {

          slot.innerHTML = element.summ // Вот тут нужно максимальное значение
        }

      })
    }
  } catch (e) { }
  }

voraa 24.10.2023 15:02

Цитата:

Сообщение от ureech
Но нужно, что бы было как то так

arr = [
{'slot':2,'age':30,'sum':''},
{'slot':1,'age':20,'sum':100},
{'slot':1,'age':20,'sum':''},
{'slot':2,'age':30,'sum':60},
]

Непонятно.
Если нужны максимальные, то откуда взялись {'slot':2,'age':30,'sum':''}, и {'slot':1,'age':20,'sum':''},

ureech 24.10.2023 15:06

voraa,
Это то, что мне нужно на выходе. Как вариант. Ну ли так
arr = [
{'slot':2,'age':30},
{'slot':1,'age':20,'sum':100},
{'slot':1,'age':20},
{'slot':2,'age':30,'sum':60},
]

Nexus 24.10.2023 15:08

Цитата:

Сообщение от ureech
И что?

Признаться, я даже не знаю, как ответить на ваш великолепный вопрос.

Цитата:

Сообщение от ureech
Я вставляю данные из массива в элементы,собранные по блокам(слотам)

Ну, т.е. вы данные пхаете в html, только для того, чтобы их снова из них считать?
Действительно «и что».

Попробуйте так:
(savedJson => {
    let data = null;
    try {
        data = savedJson ? JSON.parse(savedJson) : null;
    } catch (e) {
        console.error(e);
    }

    if (!data) {
        return;
    }

    const slotToMaxSumMap = {};
    data.forEach((item, i) => {
        const index = {
            index: i,
            sum: +(item.summ || 0),
            slot: item.slot,

            $item: item,
        };

        if (
            !(index.slot in slotToMaxSumMap) ||
            slotToMaxSumMap[index.slot].sum <= index.sum
        ) {
            slotToMaxSumMap[index.slot] = index;
        }
    });

    const dataOnlyWithMaxSum = Object.values(slotToMaxSumMap).map(item => item.$item);

    dataOnlyWithMaxSum.forEach(item => {
        const node = document.querySelector(`[data-slot="${item.slot}"].slot:not(.less-today)`);
        if (!node) {
            return;
        }

        node.innerHTML = item.summ;
    });

})(localStorage.getItem('colorRow'));


Крутой сервис: https://beautifier.io/

voraa 24.10.2023 15:23

Что то типа такого
<body>

<div class="slot" data-slot="1" data-age="20" data-sum="50"></div>
<div class="slot" data-slot="2" data-age="30" data-sum="40"></div>
<div class="slot" data-slot="1" data-age="20" data-sum="100"></div>
<div class="slot" data-slot="1" data-age="20" data-sum="70"></div>
<div class="slot" data-slot="2" data-age="30" data-sum="60"></div>

<script>
const slot = [...document.querySelectorAll('.slot')];
const map = slot.reduce((map,el) =>{
	const item = el.dataset.slot + '_' + el.dataset.age;
	map[item] ??=  +el.dataset.sum;
	if (map[item] < +el.dataset.sum) map[item] = +el.dataset.sum;
	return map;
}, {});

const arr = [];

for (const item in map) {
	const [slot, age] = item.split('_');
	arr.push({slot, age, sum: ''});
	arr.push({slot, age, sum: map[item]});
}

console.log(arr);
</script>
</body>

ureech 24.10.2023 16:59

Nexus,
Спасибо.Адаптировал к своему варианту вроде получается. Единственное смущает количество кода). Возможно стоит пересмотреть саму сборку массива.
voraa,
Сори,не написал, что у меня немного не такая логика. То есть сборка массива происходит пр клике на элемент. А не не при выборке сразу всех. Попробую применить к себе имея ваш код


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