Определить большую из 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 шт):
Для таких операций используют структуры, в которых можно хранить однородные данные.
Важно. Не уверен, что вы можете гарантировать, что максимум может быть только один, поэтому результатом поиска будет массив.
Базовый вариант - хранение в массивах:
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));
Еще вариант - создать словарь из переменных:
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)
Как уже ранее отметили, вам тут лучше всего подойдёт массив, а не отдельные переменные. Мне просто не нравится, что вам предлагают по 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, где лежит имя нового максимамального элемента
- Если же мы встречаем элемент, у которого значение равно знаечние максимального элемента, то просто добавляем его имя в массив
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 :)