Определить большую из 4 переменных

Есть 4 переменные, нужно определить, какая из них самая большая и вернуть имя переменной. Мне пришел в голову только такой метод, но он мне не нравится. Возможно есть более изящный способ?

var Kas1 = 200;
var Kas2 = 300;
var Kas3 = 50;
var Kas4 = 205;
var Max = Math.max(Kas1, Kas2, Kas3, Kas4);
if (Kas1 == Max) { var MaxKas = "Kas1"; }
if (Kas2 == Max) { var MaxKas = "Kas2"; }
if (Kas3 == Max) { var MaxKas = "Kas3"; }
if (Kas4 == Max) { var MaxKas = "Kas4"; }

Ответы (3 шт):

Автор решения: contributorpw

Для таких операций используют структуры, в которых можно хранить однородные данные.

Важно. Не уверен, что вы можете гарантировать, что максимум может быть только один, поэтому результатом поиска будет массив.

Базовый вариант - хранение в массивах:

const data = [200, 300, 50, 205];
const names = ['kas1', 'kas2', 'kas3', 'kas4'];

const max = Math.max(...data);

const result = names.filter((_, i) => data[i] === max);

console.log(result);

Но скорее всего, вы придете к тому, к чему и все - использованию объектов, как минимально необходимой для описания единицы какой-либо сущности:

const kasses = [{
    name: 'kas1',
    val: 200,
  },
  {
    name: 'kas2',
    val: 300,
  },
  {
    name: 'kas3',
    val: 50,
  },
  {
    name: 'kas4',
    val: 205,
  },
];

const max = Math.max(...kasses.map((item) => item.val));

const result = kasses.filter((item) => item.val === max);

console.log(result);
console.log(result.map(k => k.name));

→ Ссылка
Автор решения: yuriy

Еще вариант - создать словарь из переменных:

a = 3
b = 5
c = 4
d = 2

m = dict(a=a, b=b, c=c, d=d)
name = max(m.keys(), key=m.get)
print(name)
→ Ссылка
Автор решения: EzioMercer

Как уже ранее отметили, вам тут лучше всего подойдёт массив, а не отдельные переменные. Мне просто не нравится, что вам предлагают по 2-3 раза проходится по массиву, чтобы сделать такую элементарную операцию...

Я приведу пример с массивом объектов, т.к. так проще работать чем с двумя массивами возиться

Если нужно выдать имя любого из максимумов, то можно сделать так:

  1. Проходимся по массиву
  2. Если значение текущего элемента больше чем значение максимального элемента (изначально знаечние равно минус бесконечности), то обновляем имя и значение максимального элемента на текущий элемент
  3. Возвращаем имя максимального элемента, ну или весь элемент, если хотите или только значение - без разницы

const kasses = [{
    name: 'kas1',
    val: 200,
  },
  {
    name: 'kas2',
    val: 300,
  },
  {
    name: 'kas3',
    val: 50,
  },
  {
    name: 'kas4',
    val: 205,
  },
];

const findMaxKasName = kasses => {
  let maxKas = {
    name: '',
    val: -Infinity
  };

  for (let i = 0; i < kasses.length; ++i) {
    const kas = kasses[i];

    if (kas.val > maxKas.val) maxKas = kas;
  }

  return maxKas.name;
}

const maxKasName = findMaxKasName(kasses);

console.log(maxKasName);

Если же нужен массив всех максимальных элементов, то можно сдеалть так:

  1. Делаем почти всё тоже самое что и в предыдущий раз
  2. Объявляем массив для имён (значений или самих объектов)
  3. Если мы встречаем элемент, у которого значение больше чем у максимального элемента, то обновляем максимальный элемент и сбрасываем массив, то массива длины 1, где лежит имя нового максимамального элемента
  4. Если же мы встречаем элемент, у которого значение равно знаечние максимального элемента, то просто добавляем его имя в массив

const kasses = [{
    name: 'kas1',
    val: 200,
  },
  {
    name: 'kas2',
    val: 300,
  },
  {
    name: 'kas3',
    val: 50,
  },
  {
    name: 'kas4',
    val: 205,
  },
  {
    name: 'kas5',
    val: 300,
  }
];

const findMaxKasNames = kasses => {
  let maxKas = {
    name: '',
    val: -Infinity
  };
  
  let maxKassesNames = [];

  for (let i = 0; i < kasses.length; ++i) {
    const kas = kasses[i];

    if (kas.val > maxKas.val) {
      maxKas = kas;
      
      maxKassesNames = [kas.name];
      
      continue;
    }
    
    if (kas.val === maxKas.val) {
      maxKassesNames.push(kas.name);
    }
  }

  return maxKassesNames;
}

const maxKasNames = findMaxKasNames(kasses);

console.log(maxKasNames);

Как видите всё достаточно легко решается одним обычным циклом. Если вы не любитель старых циклов, то можете переписать это всё на reduce :)

→ Ссылка