Как в массиве обозначить нескольким параметрам одно значение?
Здравствуйте, есть вот такой объект, состоящий их двух атрибутов (мощность и время). Есть калькультор с шагами, по времени 5, по мощности 10. На каждую мощность максимально 60, тоесть 12 шагов внутри каждой мощности.
const info = { 10: { 5: { title: 'ываыва', description: 'Мощность 10 000 Вт/Ва', silka_ibp: 'https://....', kartinka_ibp: 'https://....', title2: 'Время 5 мин'', description2: 'sdfsdfsdfsfd', mnoj: '30 x', }, 10: { title: 'ываыва', description: 'Мощность 10 000 Вт/Ва', silka_ibp: 'https://....', kartinka_ibp: 'https://....', title2: 'Время 10 мин'', description2: 'sdfsdfsdfsfd', mnoj: '30 x', }, ..... }, 20: { 5: { title: 'ываыва', description: 'Мощность 20 000 Вт/Ва', silka_ibp: 'https://....', kartinka_ibp: 'https://....', title2: 'Время 5 мин'', description2: 'sdfsdfsdfsfd', mnoj: '30 x', }, 10: { title: 'ываыва', description: 'Мощность 20 000 Вт/Ва', silka_ibp: 'https://....', kartinka_ibp: 'https://....', title2: 'Время 10 мин', description2: 'sdfsdfsdfsfd', mnoj: '30 x', }, ..... }, ...... }, |
const info = { 10: { 5: { title: 'ываыва', description: 'Мощность 10 000 Вт/Ва', silka_ibp: 'https://....', kartinka_ibp: 'https://....', title2: 'Время 5 мин'', description2: 'sdfsdfsdfsfd', mnoj: '30 x', }, 10: { title: 'ываыва', description: 'Мощность 10 000 Вт/Ва', silka_ibp: 'https://....', kartinka_ibp: 'https://....', title2: 'Время 10 мин'', description2: 'sdfsdfsdfsfd', mnoj: '30 x', }, ..... }, 20: { 5: { title: 'ываыва', description: 'Мощность 20 000 Вт/Ва', silka_ibp: 'https://....', kartinka_ibp: 'https://....', title2: 'Время 5 мин'', description2: 'sdfsdfsdfsfd', mnoj: '30 x', }, 10: { title: 'ываыва', description: 'Мощность 20 000 Вт/Ва', silka_ibp: 'https://....', kartinka_ibp: 'https://....', title2: 'Время 10 мин', description2: 'sdfsdfsdfsfd', mnoj: '30 x', }, ..... }, ...... },
Теперь, мощность максимально 600, тоесть это нужно прописать аж 60 вариантов в каждом из которых еще 12.
Хочу упростить это, так как фактически не для каждой мощности есть параметры. И вопрос в том, как мне сделать так чтоб можно было прописать одну пачку времени, на несколько мощностей сразу. Тоесть схематично как то так
10 - 50: { 5: { .... }, ..... }, 60-80: { 5: { .... |
10 - 50: { 5: { .... }, ..... }, 60-80: { 5: { ....
Дополнительно:
хорошо бы отредактировать вопрос:
1. сформулировать понятно для всех кто вне контекста вашей задачи.
2. отформатировать код
3. в примере кода — не массив, а объект. Что за «динамичные атрибуты» вы имеете в виду?
Касательно задачи: всё в ваших руках, как использовать потом этот объект. Например, можно делать ключи строками типа "10-50" и интерпретировать их так, как имеете в виду )
var fff = '20'; const info = { 10: { 5: { fff = '50', }, }, |
var fff = '20'; const info = { 10: { 5: { fff = '50', }, },
1) про какой контекст вы говорите?? Есть два атрибута, которые зависят друг от друга, и от которых идут данные с массива (или объекта как хотите)
2) не очень понимаю что вы имелли в виду под отформатированным кодом, вроде конструкция предельно проста - внутри мощности которая равна 10 есть атрибуты времени от 5 до 60 с шагом 5, далее мощность 20 и так до 600.
3) пусть будет массивоподобный объект и просто атрибуты
"Например, можно делать ключи строками типа "10-50" и интерпретировать их так, как имеете в виду )" - что это означает? как интерпретировать? что? куда? какие ключи?
Ккак вообще называется то что я ищу, мне просто это скажите, я уже в гугле найду, так как понятия не имую что искать
let propName = '20'; const info = { 10: { 5: { [propName]: '50', }, }, }; |
let propName = '20'; const info = { 10: { 5: { [propName]: '50', }, }, };
запись 10-50 будет работать для 10, 20, 30, 40, 50 ?
Axel030392, именем свойства в объкте вполне может быть строка "10-50". Это не то же буквально, что создать свойства "10", "20", "30".. "50".
Как вы дальше работаете с объектом неизвестно. Далее в коде, где вы что-то делаете с этим объектом, можете смотреть, не является ли очередное свойство строкой со знаком дефис – и такое обрабатывать отдельно-специально.
Как один из вариантов, пишите свойства как диапазоны.
Подзадача: из массива, где могут быть и строки "20-80" найти строку, удовлетворяющую искомому значению
const findRangeKey = (keysArray, keyString) => { const num = Number(keyString); if (keysArray.includes(keyString)) { // exact match return keyString; } return keysArray.find(key => { const [min, max] = key.split('-').map(Number); if (max !== undefined) { return num >= min && num <= max; } return num === min; }); }; findRangeKey(['10', '20-40'], 30); // "20-40" findRangeKey(['10', '20-40'], 20); // "20-40" findRangeKey(['10', '20-40'], 10); // "10" |
const findRangeKey = (keysArray, keyString) => { const num = Number(keyString); if (keysArray.includes(keyString)) { // exact match return keyString; } return keysArray.find(key => { const [min, max] = key.split('-').map(Number); if (max !== undefined) { return num >= min && num <= max; } return num === min; }); }; findRangeKey(['10', '20-40'], 30); // "20-40" findRangeKey(['10', '20-40'], 20); // "20-40" findRangeKey(['10', '20-40'], 10); // "10"
И теперь можно искать в словаре с диапазонами:
const data = { '10': { '5-15': { title: '10-5-15', } }, '20-60': { '5': { title: '20-60-5' }, '10': { title: '20-60-10' }, '20-40': { title: '20-60-20-40' }, }, }; const getTitle = (data, a, b) => { const aKey = findRangeKey(Object.keys(data), a); if (!aKey) { return null; } const bKey = findRangeKey(Object.keys(data[aKey]), b); if (!bKey) { return null; } return data[aKey][bKey].title; }; console.log(getTitle(data, '10', '5')); // "10-5-15" console.log(getTitle(data, 40, 30)); // "20-60-20-40" |
const data = { '10': { '5-15': { title: '10-5-15', } }, '20-60': { '5': { title: '20-60-5' }, '10': { title: '20-60-10' }, '20-40': { title: '20-60-20-40' }, }, }; const getTitle = (data, a, b) => { const aKey = findRangeKey(Object.keys(data), a); if (!aKey) { return null; } const bKey = findRangeKey(Object.keys(data[aKey]), b); if (!bKey) { return null; } return data[aKey][bKey].title; }; console.log(getTitle(data, '10', '5')); // "10-5-15" console.log(getTitle(data, 40, 30)); // "20-60-20-40"
- А влияет ли эта конструкция на индификаторы, которые выводятся у меня так:
document.onmousemove = function(e) { const slider1value = jQuery("#slider1").roundSlider("option", "value"); const slider2value = jQuery("#slider2").roundSlider("option", "value"); jQuery('.calc_nazvanie').html(info[slider1value][slider2value].title); jQuery('.calc_descr').html(info[slider1value][slider2value].description); jQuery('.tovar_ibp').attr('href', info[slider1value][slider2value].silka_ibp); jQuery('.kartinka_ibp').attr('src', info[slider1value][slider2value].kartinka_ibp); jQuery('.calc_nazvanie2').html(info[slider1value][slider2value].title2); jQuery('.calc_descr2').html(info[slider1value][slider2value].description2); jQuery('.calc_mnojitel_akb').html(info[slider1value][slider2value].mnoj); jQuery('.tovar_akb').attr('href', info[slider1value][slider2value].silka_akb); jQuery('.kartinka_akb').attr('src', info[slider1value][slider2value].kartinka_akb); jQuery('.calc_cena_roz').html(info[slider1value][slider2value].roznica); jQuery('.diler_silver').html(info[slider1value][slider2value].silver); jQuery('.diler_gold').html(info[slider1value][slider2value].gold); jQuery('.diler_platin').html(info[slider1value][slider2value].platinum); jQuery('.silver_skidka').html(info[slider1value][slider2value].silver_sk); jQuery('.gold_skidka').html(info[slider1value][slider2value].gold_sk); jQuery('.platin_skidka').html(info[slider1value][slider2value].platinum_sk); }
document.onmousemove = function(e) { const slider1value = jQuery("#slider1").roundSlider("option", "value"); const slider2value = jQuery("#slider2").roundSlider("option", "value"); jQuery('.calc_nazvanie').html(info[slider1value][slider2value].title); jQuery('.calc_descr').html(info[slider1value][slider2value].description); jQuery('.tovar_ibp').attr('href', info[slider1value][slider2value].silka_ibp); jQuery('.kartinka_ibp').attr('src', info[slider1value][slider2value].kartinka_ibp); jQuery('.calc_nazvanie2').html(info[slider1value][slider2value].title2); jQuery('.calc_descr2').html(info[slider1value][slider2value].description2); jQuery('.calc_mnojitel_akb').html(info[slider1value][slider2value].mnoj); jQuery('.tovar_akb').attr('href', info[slider1value][slider2value].silka_akb); jQuery('.kartinka_akb').attr('src', info[slider1value][slider2value].kartinka_akb); jQuery('.calc_cena_roz').html(info[slider1value][slider2value].roznica); jQuery('.diler_silver').html(info[slider1value][slider2value].silver); jQuery('.diler_gold').html(info[slider1value][slider2value].gold); jQuery('.diler_platin').html(info[slider1value][slider2value].platinum); jQuery('.silver_skidka').html(info[slider1value][slider2value].silver_sk); jQuery('.gold_skidka').html(info[slider1value][slider2value].gold_sk); jQuery('.platin_skidka').html(info[slider1value][slider2value].platinum_sk); }
- Вот у меня такой кальеулятор - https://quwatt.kz/kalkuljator-rascheta-ibp/, вообщем я так и не понял до конца как это реализовывается
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для обозначения одного значения нескольким параметрам в массиве в PHP можно использовать ссылки на переменные. Это позволяет создать несколько указателей на одно и то же значение в памяти. Например, если у нас есть массив $arr и мы хотим, чтобы несколько его элементов указывали на одно и то же значение, мы можем сделать это следующим образом:
$value = 10; $arr = array(&$value, &$value, &$value);
Теперь все три элемента массива $arr будут указывать на значение переменной $value, и любые изменения, сделанные в одном из элементов, будут отражаться во всех остальных.
Однако следует быть осторожным при использовании ссылок в PHP, так как они могут привести к нежелательным побочным эффектам и ошибкам в коде. Убедитесь, что вы понимаете, как работают ссылки в PHP, прежде чем применять их в своем коде.