из массива объектов пересобрать массивы для фильтров параметров
У меня есть массив из объектов 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. |
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) |
Цитата:
|
Спасибо, Рони. Это именно то, что мне было нужно.
с русскими буквами тоже вроде понял 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] } } |
Цитата:
Вот мой массив объектов 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 |
рони,
почему ты так ненавидишь отступы? |
sovsem-nub,
eyeColor : a => a === void 0 || ['green', 'blue'].some(f => a.indexOf(f) != -1) |
Цитата:
|
Цитата:
|
sovsem-nub,
лучше не формировать поиск по eyeColor или попробовать так eyeColor : a => a && ['green', 'blue'].some(f => a.indexOf(f) != -1) |
Часовой пояс GMT +3, время: 13:15. |