04.01.2021, 15:55
|
|
Профессор
|
|
Регистрация: 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.
|
|
04.01.2021, 18:05
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,131
|
|
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.
|
|
04.01.2021, 20:33
|
|
Профессор
|
|
Регистрация: 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]
}
}
|
|
21.01.2021, 11:30
|
|
Профессор
|
|
Регистрация: 15.10.2014
Сообщений: 255
|
|
эта тема мне очень помогла, но я опять запнулся и не могу сдвинуться с места.
Вот мой массив объектов 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
|
|
21.01.2021, 11:47
|
|
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
рони,
почему ты так ненавидишь отступы?
|
|
21.01.2021, 11:55
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,131
|
|
sovsem-nub,
eyeColor : a => a === void 0 || ['green', 'blue'].some(f => a.indexOf(f) != -1)
Последний раз редактировалось рони, 21.01.2021 в 12:24.
|
|
21.01.2021, 12:22
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,131
|
|
Сообщение от Alexandroppolus
|
почему ты так ненавидишь отступы?
|
добавил ...
|
|
21.01.2021, 12:24
|
|
Профессор
|
|
Регистрация: 15.10.2014
Сообщений: 255
|
|
Сообщение от рони
|
sovsem-nub,
eyeColor : a => !a || ['green', 'blue'].some(f => a.indexOf(f) != -1)
|
как бы норм, ошибка исчезла но логика нарушилась. Если мы у треугольника удалим параметр "цвет" . то этот параметр читается как "любой цвет" и этот треугольник будет показываться при выборе любого цвета. А как сделать так, чтобы при выборе любого цвета он не показывался.
|
|
21.01.2021, 12:27
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,131
|
|
sovsem-nub,
лучше не формировать поиск по eyeColor или попробовать так
eyeColor : a => a && ['green', 'blue'].some(f => a.indexOf(f) != -1)
|
|
|
|