24.10.2023, 14:09
|
Профессор
|
|
Регистрация: 11.03.2013
Сообщений: 778
|
|
Собрать массив
Привет
<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},
]
|
|
24.10.2023, 14:27
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,791
|
|
Сообщение от ureech
|
мне нужны только максимальные
|
Сообщение от ureech
|
но при этом сам объект с не-максимальными тоже нужен
|
Сообщение от ureech
|
нужно, что бы было как то так *всё-в-куче*
|
Так что вам в итоге нужно-то и что у вас не получается?
Если у вас дивы только как контейнеры для данных используются, то лучше данные просто как json на страницу выгрузить в теге script с типом text/json.
|
|
24.10.2023, 14:41
|
Профессор
|
|
Регистрация: 11.03.2013
Сообщений: 778
|
|
Сообщение от Nexus
|
Если у вас дивы только как контейнеры для данных используются, то лучше данные просто как json на страницу выгрузить в теге script с типом text/json.
|
И что?
Я вставляю данные из массива в элементы,собранные по блокам(слотам)И мне нужны там только максимальные sum в каждом блоке.
|
|
24.10.2023, 14:48
|
Профессор
|
|
Регистрация: 11.03.2013
Сообщений: 778
|
|
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) { }
}
|
|
24.10.2023, 15:02
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,745
|
|
Сообщение от 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':''},
|
|
24.10.2023, 15:06
|
Профессор
|
|
Регистрация: 11.03.2013
Сообщений: 778
|
|
voraa,
Это то, что мне нужно на выходе. Как вариант. Ну ли так
arr = [
{'slot':2,'age':30},
{'slot':1,'age':20,'sum':100},
{'slot':1,'age':20},
{'slot':2,'age':30,'sum':60},
]
|
|
24.10.2023, 15:08
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,791
|
|
Сообщение от 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/
Последний раз редактировалось Nexus, 24.10.2023 в 15:11.
|
|
24.10.2023, 15:23
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,745
|
|
Что то типа такого
<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>
Последний раз редактировалось voraa, 24.10.2023 в 15:26.
|
|
24.10.2023, 16:59
|
Профессор
|
|
Регистрация: 11.03.2013
Сообщений: 778
|
|
Nexus,
Спасибо.Адаптировал к своему варианту вроде получается. Единственное смущает количество кода). Возможно стоит пересмотреть саму сборку массива.
voraa,
Сори,не написал, что у меня немного не такая логика. То есть сборка массива происходит пр клике на элемент. А не не при выборке сразу всех. Попробую применить к себе имея ваш код
|
|
|
|