Вход

Просмотр полной версии : Собрать массив


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
мне нужны только максимальные
но при этом сам объект с не-максимальными тоже нужен
нужно, что бы было как то так *всё-в-куче*
Так что вам в итоге нужно-то и что у вас не получается?

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

ureech
24.10.2023, 14:41
Если у вас дивы только как контейнеры для данных используются, то лучше данные просто как 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
Но нужно, что бы было как то так

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
И что?
Признаться, я даже не знаю, как ответить на ваш великолепный вопрос.

Я вставляю данные из массива в элементы,собранные по блокам(слотам)
Ну, т.е. вы данные пхаете в 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,
Сори,не написал, что у меня немного не такая логика. То есть сборка массива происходит пр клике на элемент. А не не при выборке сразу всех. Попробую применить к себе имея ваш код