Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.10.2023, 14:09
Профессор
Отправить личное сообщение для ureech Посмотреть профиль Найти все сообщения от ureech
 
Регистрация: 11.03.2013
Сообщений: 765

Собрать массив
Привет
<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},
]
Ответить с цитированием
  #2 (permalink)  
Старый 24.10.2023, 14:27
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,729

Сообщение от ureech
мне нужны только максимальные
Сообщение от ureech
но при этом сам объект с не-максимальными тоже нужен
Сообщение от ureech
нужно, что бы было как то так *всё-в-куче*
Так что вам в итоге нужно-то и что у вас не получается?

Если у вас дивы только как контейнеры для данных используются, то лучше данные просто как json на страницу выгрузить в теге script с типом text/json.
Ответить с цитированием
  #3 (permalink)  
Старый 24.10.2023, 14:41
Профессор
Отправить личное сообщение для ureech Посмотреть профиль Найти все сообщения от ureech
 
Регистрация: 11.03.2013
Сообщений: 765

Сообщение от Nexus
Если у вас дивы только как контейнеры для данных используются, то лучше данные просто как json на страницу выгрузить в теге script с типом text/json.
И что?
Я вставляю данные из массива в элементы,собранные по блокам(слотам)И мне нужны там только максимальные sum в каждом блоке.
Ответить с цитированием
  #4 (permalink)  
Старый 24.10.2023, 14:48
Профессор
Отправить личное сообщение для ureech Посмотреть профиль Найти все сообщения от ureech
 
Регистрация: 11.03.2013
Сообщений: 765

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) { }
  }
Ответить с цитированием
  #5 (permalink)  
Старый 24.10.2023, 15:02
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,707

Сообщение от 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':''},
Ответить с цитированием
  #6 (permalink)  
Старый 24.10.2023, 15:06
Профессор
Отправить личное сообщение для ureech Посмотреть профиль Найти все сообщения от ureech
 
Регистрация: 11.03.2013
Сообщений: 765

voraa,
Это то, что мне нужно на выходе. Как вариант. Ну ли так
arr = [
{'slot':2,'age':30},
{'slot':1,'age':20,'sum':100},
{'slot':1,'age':20},
{'slot':2,'age':30,'sum':60},
]
Ответить с цитированием
  #7 (permalink)  
Старый 24.10.2023, 15:08
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,729

Сообщение от 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.
Ответить с цитированием
  #8 (permalink)  
Старый 24.10.2023, 15:23
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,707

Что то типа такого
<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.
Ответить с цитированием
  #9 (permalink)  
Старый 24.10.2023, 16:59
Профессор
Отправить личное сообщение для ureech Посмотреть профиль Найти все сообщения от ureech
 
Регистрация: 11.03.2013
Сообщений: 765

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Собрать данные из div в массив chester Общие вопросы Javascript 5 01.06.2022 15:00
Собрать массив и записать в localstorage mav1 Events/DOM/Window 2 06.07.2016 00:23
Собрать массив из таблицы V2oD2o jQuery 4 25.04.2016 17:04
Как собрать все данные из таблицы, и отправить массив на сервер optsar AJAX и COMET 14 11.12.2015 07:58
Собрать массив из элементов DOM Fairy-Wilbury Events/DOM/Window 4 13.09.2013 17:30