Javascript.RU

Результаты опроса: Map(): удобные "массивы"
Я знаю, что такое Map() и пользуюсь им 3 60.00%
Слышал про Map(), но не пользуюсь 2 40.00%
Не знаю, что такое Map() 0 0%
Голосовавшие: 5. Этот опрос закрыт

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 06.04.2020, 19:08
Интересующийся
Отправить личное сообщение для shurikkan Посмотреть профиль Найти все сообщения от shurikkan
 
Регистрация: 03.05.2014
Сообщений: 21

Сборка объекта из массивов [без Map()]
Привет всем.

Собираю объект для отображения в DOM из массивов с объектами.
В каждом массиве содержатся специфические свойства для, в качестве ключа - object_id.

Пример массивов:
info: [
    { id: 26, name: "CWVA", group: "EA211" }
    { id: 90, name: "CWVB", group: "EA211" }
]
sensors: [
    { id: 1, object_id: 19, name: tempOil, value: 115 }
    { id: 3, object_id: 90, name: tempOut, value: 9 }
    { id: 2, object_id: 26, name: tempOil, value: 90 }
    ...
]
props: [
    { id: 1, object_id: 26, status: off, RpM: 0 }
    { id: 2, object_id: 90, status: on, RpM: 1208 }
    ...
]


На выходе мне нужен объект, вида:
myObject {
    id: 26,
    name: "CWVA",
    group: "EA211",
    sensors: [
        tempOil: 90,
        ...
    ],
    props: {
        status: off, 
        RpM: 0
    }
}


Сейчас я пропускаю через for of все массивы и беру из них элемент с нужным object_id. Проблема в том, что кол-во объектов растёт, а массивы со свойствами для обновления таких объектов прилетают всё чаще.

Думал перейти на Map(), но такой возможности нет (VueJS не поддерживает рендеринг DOM через директиву v-for с параметром в виде объекта Map, только простые массивы/объекты).

Может кто подскажет как можно оптимизировать код? Можно ли избавиться от циклов, не перебирать постоянно каждый??

Заранее спасибо за ответы!

P.S.: Не очень хочется связываться с промисами в данном контексте, т.к., на сколько я понимаю, может быть переполнение стека...

Последний раз редактировалось shurikkan, 06.04.2020 в 19:19.
Ответить с цитированием
  #2 (permalink)  
Старый 06.04.2020, 19:19
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

shurikkan,
может один раз из массива сделать объект и не мучатся больше с for.
Ответить с цитированием
  #3 (permalink)  
Старый 06.04.2020, 19:21
Интересующийся
Отправить личное сообщение для shurikkan Посмотреть профиль Найти все сообщения от shurikkan
 
Регистрация: 03.05.2014
Сообщений: 21

Сообщение от рони Посмотреть сообщение
shurikkan,
может один раз из массива сделать объект и не мучатся больше с for.
Так дело в том, что мне нужно обновлять объект каждый раз, когда прилетает новый массив для него.
Я может не понял о чём ты. Можно подробнее?

Последний раз редактировалось shurikkan, 06.04.2020 в 19:29.
Ответить с цитированием
  #4 (permalink)  
Старый 06.04.2020, 19:44
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

shurikkan,

info = [
    { id: 26, name: "CWVA", group: "EA211" },
    { id: 90, name: "CWVB", group: "EA211" }
]
sensors = [
    { id: 1, object_id: 19, name: "tempOil", value: 115 },
    { id: 3, object_id: 90, name: "tempOut", value: 9 },
    { id: 2, object_id: 26, name: "tempOil", value: 90 },
]
props = [
    { id: 1, object_id: 26, status: "off", RpM: 0 },
    { id: 2, object_id: 90, status: "on", RpM: 1208 }
]


i = info.reduce((obj, {id, name, group}) => (obj[id] = {id, name, group}, obj), {})
s = sensors.reduce((obj, {object_id, name, value}) => (obj[object_id] = {name, value}, obj), {})
p = props.reduce((obj, {object_id, status, RpM}) => (obj[object_id] = {status, RpM}, obj), {})

const create = id => {
const obj = i[id], sensors = s[id], props = p[id];
return {...obj, sensors, props}
}

console.log(create(26));
console.log(create(90))
Ответить с цитированием
  #5 (permalink)  
Старый 06.04.2020, 19:44
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,795

Сообщение от shurikkan
Сейчас я пропускаю через for of все массивы и беру из них элемент с нужным object_id. Проблема в том, что кол-во объектов растёт, а массивы со свойствами для обновления таких объектов прилетают всё чаще.
Опишите подробнее, что у вас происходит.
Сейчас ничего непонятно.

У вас real-time прилетают десятки тысяч изменений отображаемых моделей в течении малого кол-ва времени?
Не пробовали на сервере формировать данные и отдавать их уже в нужном клиенту виде?

Вам не кажется, что, исходя из ваших данных, итоговый объект должен несколько иначе выглядеть?
Как-то так:
{
    id: 26,
    name: "CWVA",
    group: "EA211",
    sensors: [
        tempOil: 90,
        ...
    ],
    props: [
        {
            status: off, 
            RpM: 0
        }, 
        ...
    ]
}
Ответить с цитированием
  #6 (permalink)  
Старый 06.04.2020, 19:47
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

shurikkan,
в момент получения массива преобразуйте его в объект, а лучше сразу на сервере это сделать.
Ответить с цитированием
  #7 (permalink)  
Старый 15.04.2020, 13:21
Интересующийся
Отправить личное сообщение для shurikkan Посмотреть профиль Найти все сообщения от shurikkan
 
Регистрация: 03.05.2014
Сообщений: 21

Сообщение от рони Посмотреть сообщение
shurikkan,
в момент получения массива преобразуйте его в объект, а лучше сразу на сервере это сделать.
Так и сделал. { id_1: { все_свойства}, id_n: { ... } }
Всем спасибо за советы!
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Можно ли получить имя экземпляра объекта внутри самого объекта? Ichigeki Общие вопросы Javascript 9 14.11.2008 19:00