2016-06-04 1 views
1

У меня есть пять переменных - организм. Один, организм. Два и т. Д., До пяти. Все они равны случайным числам.Как получить Math.min(), чтобы вернуть имя переменной вместо числа

Я пытаюсь найти наименьшее из них, что я могу сделать с помощью Math.min().

Однако Math.min возвращает минимальное число вместо имени переменной, которое содержит это минимальное значение.

Пожалуйста, помогите, но я скорее всего новичок в JavaScript. Это мой код до сих пор:

runt = Math.min(organism.one, organism.two, organism.three, organism.four, organism.five); 
console.log("The runt is " + runt); 
+2

Неясно, что вы просите. 'min()' возвращает число - это то, что он делает.Его задача - вернуть самое низкое число в наборе. Что вы хотите сделать вместо этого? – Utkanos

+2

Помните - даже если min() возвращен и объект, ваша функция console.log все равно будет показывать 'runt' как число! – dafyddPrys

+0

Я попытался прояснить вопрос. Я прав? Кроме того, что вернуть, если есть две переменные с минимальными значениями? – nicael

ответ

1

Поскольку у вас есть объект с ключами, которые содержат номера, вы можете использовать for ... in перебирать их, чтобы найти наименьший ключ:

var organism = { 
 
     one: 50, 
 
     two: 100, 
 
     three: 25, 
 
     four: 15, 
 
     five: 999 
 
    }, 
 
    min = Infinity, 
 
    key; 
 
    
 
for(var i in organism) { 
 
    if(organism[i] < min) { 
 
    min = organism[i]; 
 
    key = i; 
 
    } 
 
} 
 

 
console.log(key); //four

0

Это должно сделать это:

var lowestValsKey; 
for(var key in organism){ 
    if(!lowestValsKey){ 
     lowestValsKey = key; 
    } 
    if(organism[key] < organism[lowestValsKey]){ 
     lowestValsKey = key; 
    } 
} 

console.log(lowestValsKey); 
0

Если я понимаю, что вы пытаетесь сделать, возможно, вы можете использовать объектно-ориентированный подход.

var organism = { "one" : someValue, "two" : someValue, "three" : someValue, "four": someValue, "five": someValue }; 
var min = null; 
var minKey = null; 

for(var key in organism){ 
    if(null === min){ 
     // we're at the beginning of the object, so assign min to that value. 
     min = organism[key]; 
     minKey = key; 
    } 
    else if((null !== min) && (organism[key] < min)){ 
     min = organism[key]; 
     minKey = key; 
    } 
} 
console.log("The key with the min value is: " + key + " and the value is: " + organism[key]); 
0

Мое предложение использовать [] .reduce

var objects = [{ 
    name: 'one', 
    val: 13 
}, 
{ 
    name: 'two', 
    val: 12 
}, 
{ 
    name: 'three', 
    val: 11 
}]; 

var minimum = objects.reduce(function(obj1, obj2){ 
    return (obj1.val < obj2.val) ? obj1: obj2;   
}); 

console.log(minimum.val) 
0

Нет необходимости для всех этих различных функций, Вы очень близки, вам просто нужно один цикл, чтобы сделать это:

После вы получаете мин, цикл через объект, чтобы найти спичку:

JSBin Example

var organism = { 
    two: 2, 
    three: 3, 
    four: 4, 
    one: 1, 
    five: 5 
}; 

var runt = Math.min(organism.one, organism.two, organism.three, organism.four, organism.five); 

var lowest; 
for (var org in organism) { 
    if (organism[org] === runt) { 
    lowest = org; 
    } 
} 
0

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

Однако, если я правильно читать ваш вопрос, что вы на самом деле спрашиваю:

Могу ли я передать объект в функцию и получить имя ключа наименьшее значение?

Если да, то есть способ сделать это.

var organism = { 
 
    one: 12, 
 
    two: 19, 
 
    three: -1, 
 
    four: 99, 
 
    five: 6 
 
}; 
 

 
function findSmallestKey(obj) { 
 
    var smallestKey; 
 
    var smallestValue = Number.MAX_VALUE; 
 

 
    Object.keys(obj).forEach((key) => { 
 
    var val = obj[key]; 
 
    
 
    if (val < smallestValue) { 
 
     smallestValue = val; 
 
     smallestKey = key; 
 
    } 
 

 
    }); 
 
    
 
    return smallestKey; 
 
} 
 

 
var k = findSmallestKey(organism); 
 

 
console.log('Smallest key is ', k);

0

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

function main(){ 
 

 
    function getRandom(min,max){ 
 
    return Math.floor(Math.random()*(max-min))+min; 
 
    } 
 
    
 
    var organism = { 
 
    one: getRandom(1,10), 
 
    two: getRandom(1,10), 
 
    three: getRandom(1,10), 
 
    four: getRandom(1,10), 
 
    five: getRandom(1,10), 
 
    }; 
 

 

 
    function findMin(obj){ 
 
    
 
    var keys = Object.keys(obj); 
 
    var min = { 
 
     name:keys[0], 
 
     val:obj[keys[0]] 
 
    }; 
 
       
 
    keys.forEach((key)=>{ 
 
     if (obj[key] < min.val) 
 
     min={name:key,val:obj[key]}; 
 
    }); 
 
    
 
    return min; 
 
    } 
 

 
    var min = findMin(organism); 
 
    document.getElementById('organisms').innerHTML = JSON.stringify(organism); 
 
    document.getElementById('min').innerHTML = ([min.name,min.val].join(': ')); 
 
    
 
}
<button onclick="main();">Run</button> 
 
<pre id="organisms"></pre> 
 
<div id="min"></div>

+0

Я просто размещаю это в дополнение к множеству ответов, потому что это забавное разминочное упражнение. – vol7ron

Смежные вопросы