Как в массиве обозначить нескольким параметрам одно значение?

Ссылка скопирована
1 ответ

Здравствуйте, есть вот такой объект, состоящий их двух атрибутов (мощность и время). Есть калькультор с шагами, по времени 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" и интерпретировать их так, как имеете в виду )

  • Сергей Соколов, тоесть запись 10-50 будет работать для 10, 20, 30, 40, 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" и интерпретировать их так, как имеете в виду )" - что это означает? как интерпретировать? что? куда? какие ключи?

    Ккак вообще называется то что я ищу, мне просто это скажите, я уже в гугле найду, так как понятия не имую что искать

  • Axel030392, переменные в имени свойства — можно, в квадратных скобках:
    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".
    Как вы дальше работаете с объектом неизвестно. Далее в коде, где вы что-то делаете с этим объектом, можете смотреть, не является ли очередное свойство строкой со знаком дефис – и такое обрабатывать отдельно-специально.

  • Сергей Соколов, именем свойства в объкте вполне может быть строка "10-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/, вообщем я так и не понял до конца как это реализовывается
    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Елена Вебер Ответ

    Для обозначения одного значения нескольким параметрам в массиве в PHP можно использовать ссылки на переменные. Это позволяет создать несколько указателей на одно и то же значение в памяти. Например, если у нас есть массив $arr и мы хотим, чтобы несколько его элементов указывали на одно и то же значение, мы можем сделать это следующим образом:

    $value = 10;
    $arr = array(&$value, &$value, &$value);

    $value = 10; $arr = array(&$value, &$value, &$value);

    Теперь все три элемента массива $arr будут указывать на значение переменной $value, и любые изменения, сделанные в одном из элементов, будут отражаться во всех остальных.

    Однако следует быть осторожным при использовании ссылок в PHP, так как они могут привести к нежелательным побочным эффектам и ошибкам в коде. Убедитесь, что вы понимаете, как работают ссылки в PHP, прежде чем применять их в своем коде.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно