2016-04-13 6 views
0

У меня есть следующие внутри вызова Ajax:возвращает наибольшее число из свойств объекта значения

 for (var key in json.rating) { 
      var numb = Math.max(json.rating[key]); 
     } 
     console.log(numb); 

"rating":{ 
"overall": 92, 
"atmosphere": 93, 
"cleanliness": 94, 
"facilities": 89, 
"staff": 94, 
"security": 92, 
"location": 88, 
"valueForMoney": 92 
}, 

Похоже, онемение не возвращает наибольшее число, как я думал, что это будет.

Это возвращение 92

+2

Вы постоянно переписываете номер, чтобы номер был последним. Чтобы не путать себя, объявите 'var numb = 0;' * before * ваш цикл и используйте 'numb = Math.max (numb, json.rating [key])', чтобы включить текущее значение в ваш максимальный расчет. – h2ooooooo

+0

Попробуйте следующее: 'Math.max.apply (null, Object.keys (json.rating) .map (function (k) {return json.rating [k];}))' –

ответ

1

Проблема:

Основная проблема здесь состоит в том, что вы просто итерация ключи объекта и переписывания значение ключа внутри вашей numb переменной, потому что вы передаете только один аргумент Math.max() который итерированные номер.

Таким образом, вы всегда получите последнее итерированное значение, которое объясняет, почему вы получили 92.

Решение:

На самом деле вы должны инициализировать numb vraiable и всегда сравнить его с каждым итерированного значением, это отредактированный фрагмент:

var json = { 
 
    "rating": { 
 
    "overall": 92, 
 
    "atmosphere": 93, 
 
    "cleanliness": 94, 
 
    "facilities": 89, 
 
    "staff": 94, 
 
    "security": 92, 
 
    "location": 88, 
 
    "valueForMoney": 92 
 
    } 
 
}; 
 

 
var numb = 0; 
 
for (var key in json.rating) { 
 
    numb = Math.max(json.rating[key], numb); 
 
} 
 
document.write(numb);

Примечание :

Предполагается, что все ваши значения являются положительными числами, поэтому я инициализировал его до 0, иначе просто инициализируйте numb до -Infinity.

0

Math.max() Функция принимает последовательность чисел и возвращает самый высокий из этой последовательности.

В вашем случае: Вы называете max() много раз только один аргумент каждый раз, и каждый раз max() возвращает только этот аргумент. Итак, все, что вы передали в своем последнем звонке, - это окончательное значение numb.

Решение 1: Составьте список чисел, используя ваш цикл, а затем позвоните max() и передайте этот список. Тем не менее, это итерация дважды над вашей последовательностью чисел (Обратите внимание на использовании spread operator.)

numbers = [] 
for (var key in json.rating) { 
    numbers.push(json.rating[key]); 
} 
numb = Math.max(...numbers); 
console.log(numb); 

Решение 2: Держа наибольшее значение и сравнить его со значением текущей итерации. Это повторяется только один раз над вашей последовательностью чисел.

numb = Number.MIN_VALUE; 
for (var key in json.rating) { 
    numb = Math.max(numb, json.rating[key]); 
} 
console.log(numb); 
0

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

var numb = -999999; 
    for(var key in json.rating) { 
     numb = Math.max(numb, json.rating[key]); 
    } 
    console.log(numb); 
+0

Если я хочу вернуть связанное свойство с наибольшим числом? «Персонал, например» – Alex

+1

@ h2ooooooo, 'Number.MIN_VALUE' return' 5e-324', нам нужен ** отрицательный ** 'Number.MAX_VALUE' с' -1.7976931348623157e + 308'. –

0

Вы должны вычислить максимальное значение.один из способов сделать это:

var maxNumber = -Infinity; 
for (var key in json.rating) { 
    maxNumber = Math.max(maxNumber, json.rating[key]); 
} 
console.log(maxNumber); 

таким образом, вы постоянно сравнивая текущее значение с сохраненным максимальным значением

0

Вы можете сделать это следующим образом:

var rating = { 
"overall": 92, 
"atmosphere": 93, 
"cleanliness": 94, 
"facilities": 89, 
"staff": 94, 
"security": 92, 
"location": 88, 
"valueForMoney": 92 
} 

//get all the values in an array 
var allvalues = Object.keys(rating).map(function(key){return rating[key];}); 

// get the max value from the array 
console.log(Math.max.apply(null, allvalues)); 
+0

Это повторяется * дважды * по последовательности элементов: один раз, чтобы создать список всех чисел, и второй раз, чтобы найти максимальное количество этого списка. – Jens

0
var rating = { 
     "overall": 92, 
     "atmosphere": 93, 
     "cleanliness": 94, 
     "facilities": 89, 
     "staff": 94, 
     "security": 92, 
     "location": 88, 
     "valueForMoney": 92 
}; 

var arr = Object.keys(rating).map(function (key) { return rating[key]; }); 
var min = Math.min.apply(null, arr); 
var max = Math.max.apply(null, arr); 

console.log('Min value: ' + min + ', max value: ' + max); 
+0

Это не работает, потому что ['max()'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max) по-прежнему сравнивает только одно значение, которое это проблема в первую очередь. – Jens

0

You может выполнять итерацию по клавишам и уменьшать значение до макс.

var rating = { atmosphere: 85, cleanliness: 91, facilities: 91, staff: 85, security: 94, location: 78, valueForMoney: 85 }, 
 
    hi = Object.keys(rating).reduce(function (r, k) { 
 
     return Math.max(r, rating[k]); 
 
    }, -Number.MAX_VALUE); 
 

 
document.write(hi);

0

кажется, что вы забыли объявить "вар онемела = 0", и, прежде чем использовать петлю, пожалуйста, измените "Math.max (json.rating [ключ])" в " Math.max (numb, json.rating [key]) " , тогда он будет действовать соответственно

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