@Axel030392

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

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


Теперь, мощность максимально 600, тоесть это нужно прописать аж 60 вариантов в каждом из которых еще 12.
Хочу упростить это, так как фактически не для каждой мощности есть параметры. И вопрос в том, как мне сделать так чтоб можно было прописать одну пачку времени, на несколько мощностей сразу. Тоесть схематично как то так

10 - 50: {
    5: {
          ....
  },
   ..... },
60-80: {
 5: {
          ....
  • Вопрос задан
  • 94 просмотра
Решения вопроса 1
sergiks
@sergiks Куратор тега JavaScript
♬♬
Как один из вариантов, пишите свойства как диапазоны.

Подзадача: из массива, где могут быть и строки "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 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"
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы