Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 04.01.2021, 15:55
Аватар для sovsem-nub
Профессор
Отправить личное сообщение для sovsem-nub Посмотреть профиль Найти все сообщения от sovsem-nub
 
Регистрация: 15.10.2014
Сообщений: 255

из массива объектов пересобрать массивы для фильтров параметров
У меня есть массив из объектов https://jsfiddle.net/zip13/jdyqmvrc/34/ , у каждого объекта всегда есть уникальный идентификатор item_name, также объекты могут обладать (или не обладать) какими-то параметрами. Заранее эти параметры неизвестны, это может быть например цвет:красный и размер:большой

все ключи параметров начинаются с item_parametr-
в итоге я хочу получить массивы из всех item_name, которые содержат одинаковую пару item_parametr-....: значение (потом как-то собираюсь привязать эти массивы к чекбоксам, код которых тоже будет генериться из этого массива.. ).

Перебирая массив и, натыкаясь на ключ, который начинается с item_parametr-... и его значение, проверяю была ли раньше такая пара ключ:значение (как это сделать?) если раньше не было, то создаю новый объект с массивом и push туда значение item_name (если было, то push в прежний массив). К этому массиву нужно будет как-то потом обращаться, поэтому вяжу через объект в объекте? {item_parametr-цвет:{"синий":[zn1,345345341,35345,34675467xx]}}


проблема в том, что я не могу создать объект внутри объекта . Ругается на [ и массив тоже не понимаю как туда запихать. И не понятно как быть с русскими буквами...

вот мой массив объектов https://jsfiddle.net/zip13/jdyqmvrc/34/

в итоге хочу получить вот такую штуку с чекбоксами https://heeg.ru/test/heeg.html#Figures но пока хотя бы разобраться с получением массивов

если я куда-то не туда полез, то подскажите как решаются такие задачи по фильтрам на javascript.
Ответить с цитированием
  #2 (permalink)  
Старый 04.01.2021, 18:05
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

sovsem-nub,
const arr = []; //вставить свои данные
let parametr = {};
for (let item of arr) {
    for (let key in item) {
        let [_, name] = key.split("parametr-");
        if (name) {
            name = decodeURI(name)
            if (!parametr[name]) parametr[name] = {};
            let value = item[key];
            if (!parametr[name][value]) parametr[name][value] = [];
            parametr[name][value].push(item.item_name);
        }
    }
}
console.log(parametr)

Последний раз редактировалось рони, 21.01.2021 в 11:59.
Ответить с цитированием
  #3 (permalink)  
Старый 04.01.2021, 18:15
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Сообщение от sovsem-nub
подскажите как решаются такие задачи по фильтрам на javascript.
https://javascript.ru/forum/misc/753...tml#post495309
Ответить с цитированием
  #4 (permalink)  
Старый 04.01.2021, 20:33
Аватар для sovsem-nub
Профессор
Отправить личное сообщение для sovsem-nub Посмотреть профиль Найти все сообщения от sovsem-nub
 
Регистрация: 15.10.2014
Сообщений: 255

Спасибо, Рони. Это именно то, что мне было нужно.

с русскими буквами тоже вроде понял

console.log(parametr["размер"]["Большой"][0])

{
  размер: {
    Большой: [345345, 567567811, 56756781, 345453453567, 3453453411, 5675678, 45645645, 34534534, 345345341],
    Маленький: [345336, 3453434, 3454356, 2342335, 34543561, 45664546, 456645461, 23423351, 34534341],
    Средний: [43547776, 544345, 967875, 54434511, 4354777611, 9678751, 435477761, 96787511, 5443451]
  },
  цвет: {
    зеленый: [345345, 544345, 3454356, 54434511, 34543561, 345453453567, 5443451, 45645645, 34534341],
    красный: [345336, 43547776, 567567811, 56756781, 4354777611, 45664546, 435477761, 5675678, 456645461],
    синий: [3453434, 967875, 2342335, 9678751, 3453453411, 96787511, 23423351, 34534534, 345345341]
  }
}
Ответить с цитированием
  #5 (permalink)  
Старый 21.01.2021, 11:30
Аватар для sovsem-nub
Профессор
Отправить личное сообщение для sovsem-nub Посмотреть профиль Найти все сообщения от sovsem-nub
 
Регистрация: 15.10.2014
Сообщений: 255

Сообщение от рони Посмотреть сообщение
https://javascript.ru/forum/misc/753...tml#post495309
эта тема мне очень помогла, но я опять запнулся и не могу сдвинуться с места.

Вот мой массив объектов https://jsfiddle.net/zip13/jdyqmvrc/191/
решил, что если параметров несколько буду хранить их не массивом а строкой через запятую и пробел , а потом str.split(',').trim()

все норм, все работает, но если у какого-то объекта в массиве удалить параметр для фильтра (например "item_parametr-%D1%86%D0%B2%D0%B5%D1%82":"зеленый")

то вылетает ошибка, что в .some(f => a.split(',').indexOf(f) != -1) a undefined и его нельзя split

как внутрь этой конструкции вставить проверку a на undefined?

когда пишу if(a){a.split(',').indexOf(f) != -1)} пишет, что так нельзя.

пробовал варианты с ? и : тоже не срослось.

вот почти рабочая демка https://heeg.ru/shop2_2.html?id=16gD...VxeOmY#Figures

пока она подсасывает данные (немного с тормозами) из этой таблички https://docs.google.com/spreadsheets...#gid=433540076
Ответить с цитированием
  #6 (permalink)  
Старый 21.01.2021, 11:47
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

рони,
почему ты так ненавидишь отступы?
Ответить с цитированием
  #7 (permalink)  
Старый 21.01.2021, 11:55
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

sovsem-nub,
eyeColor : a => a  === void 0 || ['green', 'blue'].some(f => a.indexOf(f) != -1)

Последний раз редактировалось рони, 21.01.2021 в 12:24.
Ответить с цитированием
  #8 (permalink)  
Старый 21.01.2021, 12:22
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Сообщение от Alexandroppolus
почему ты так ненавидишь отступы?
добавил ...
Ответить с цитированием
  #9 (permalink)  
Старый 21.01.2021, 12:24
Аватар для sovsem-nub
Профессор
Отправить личное сообщение для sovsem-nub Посмотреть профиль Найти все сообщения от sovsem-nub
 
Регистрация: 15.10.2014
Сообщений: 255

Сообщение от рони Посмотреть сообщение
sovsem-nub,
eyeColor : a => !a || ['green', 'blue'].some(f => a.indexOf(f) != -1)
как бы норм, ошибка исчезла но логика нарушилась. Если мы у треугольника удалим параметр "цвет" . то этот параметр читается как "любой цвет" и этот треугольник будет показываться при выборе любого цвета. А как сделать так, чтобы при выборе любого цвета он не показывался.
Ответить с цитированием
  #10 (permalink)  
Старый 21.01.2021, 12:27
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

sovsem-nub,
лучше не формировать поиск по eyeColor или попробовать так

eyeColor : a => a && ['green', 'blue'].some(f => a.indexOf(f) != -1)
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужен цикл для создания огромного массива apish Общие вопросы Javascript 2 20.09.2012 16:10
Составить алгоритм и программу для решения следующей задачи. Даны два массива X (5), rjabijj Общие вопросы Javascript 2 05.07.2012 22:02
Как выглядит строка параметров для post запроса? abc_ua AJAX и COMET 2 17.10.2011 13:25
Можно ли как для произвольного массива создавать вызовы функций , имеющих на входе kefi Общие вопросы Javascript 3 17.04.2009 16:53