Собрать массив
Привет
<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}, ] |
Цитата:
Цитата:
Цитата:
Если у вас дивы только как контейнеры для данных используются, то лучше данные просто как json на страницу выгрузить в теге script с типом text/json. |
Цитата:
Я вставляю данные из массива в элементы,собранные по блокам(слотам)И мне нужны там только максимальные sum в каждом блоке. |
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) { } } |
Цитата:
Если нужны максимальные, то откуда взялись {'slot':2,'age':30,'sum':''}, и {'slot':1,'age':20,'sum':''}, |
voraa,
Это то, что мне нужно на выходе. Как вариант. Ну ли так arr = [ {'slot':2,'age':30}, {'slot':1,'age':20,'sum':100}, {'slot':1,'age':20}, {'slot':2,'age':30,'sum':60}, ] |
Цитата:
Цитата:
Действительно «и что». Попробуйте так: (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/ |
Что то типа такого
<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> |
Nexus,
Спасибо.Адаптировал к своему варианту вроде получается. Единственное смущает количество кода). Возможно стоит пересмотреть саму сборку массива. voraa, Сори,не написал, что у меня немного не такая логика. То есть сборка массива происходит пр клике на элемент. А не не при выборке сразу всех. Попробую применить к себе имея ваш код |
Часовой пояс GMT +3, время: 19:38. |