У меня есть массив вроде
arr[1] = 234;
arr[2] = 345;
...
arr[40] = 126;
Как я могу получить индекс элемента с наивысшим значением без повторения массива?
У меня есть массив вроде
arr[1] = 234;
arr[2] = 345;
...
arr[40] = 126;
Как я могу получить индекс элемента с наивысшим значением без повторения массива?
Вы можете применить Math.max и передать массив в качестве аргументов -
arr.indexOf(Math.max.apply(window,arr))
Но теперь Math.max выполняет итерацию, как и сортировка.
Кто-то должен смотреть на каждый элемент в несортированном массиве...
С jQuery так же просто, как:
// Get the max value from the array
maxValue = Math.max.apply(this, arr);
// Get the index of the max value, through the built in function inArray
$.inArray(maxValue,arr);
Если массив не упорядочен, вы не можете сделать это без итерации.
Получить ключ массива с самым высоким значением в javascript
var cars = ["Saab", "Volvo", "BMW"];
var max_car_result = cars[cars.length-1];
alert(max_car_result);
Попробуйте следующее:
var max_index = -1;
var max_value = Number.MIN_VALUE;
for(var i = 0; i < arr.length; i++)
{
if(arr[i] > max_value)
{
max_value = arr[i];
max_index = i;
}
}
Вы можете использовать функцию для установки переменной. И отслеживайте max в этой функции. Вот быстрый пример без проверки типов, тестирования или поддержки для удаления значения.
Array.prototype.maxValue = null;
Array.prototype.setIndex = function(index, value){
this[index] = value;
if (value > this.maxValue || this.maxValue == null)
this.maxValue = value;
}
var arr = new Array();
arr.setIndex(0, 234);
arr.setIndex(1, 500);
arr.setIndex(2, -5);
var maxValue = arr.maxValue;
Очевидно, это лучше, если вы в настоящее время настраиваете такие элементы:
var arr = new Array();
arr[0] = 1;
arr[1] = 500;
arr[2] = 2;
Вместо этого:
var arr = { 1, 500, 2 };
Недостаток - это нелогично и требует использования функции для получения правильных результатов.
Храните массив отсортированным или используйте кучу.
Иначе итерация. Даже если вы нашли какой-то трюк, чтобы сделать это, все равно потребовалось бы итерации снизу, так почему бы не повторить?
Если это похоже на слишком много кода, поместите его в отдельную процедуру.
Два решения: сортировать убывающий порядок и получить первый элемент или:
function bigger(array) {
if (array.length < 1) {
return -1;
}
bigger = 0;
for(var i=1; i<array.length;i++ ) {
if(array[i] > array[bigger]) {
bigger = i;
}
}
return bigger;
}
холодная оптимизация с использованием двух переменных: одна для позиции и другая для содержимого.
Либо у вас будет итерация где-нибудь (в коде или в JQuery.each()), либо вы можете определить что-то вроде этого:
Array.prototype.mpush = function(v)
{
var maxv = this.maxValue || Number.MIN_VALUE;
if( v > maxv ) { this.maxValue = v; this.maxIndex = this.length; }
this.push(v);
}
и используйте arr.mpush(v)
для заполнения массива. В этом случае массив будет иметь свойство maxIndex.
Это старый вопрос, но вот моя простая эмуляция PHP script max()
, сделанная в javascript:
function max(array){
if(Object.prototype.toString.call( array ) === '[object Array]'){
return array[(array.length-1)];
}
else return 0;
}
Это возвращаемое значение последнего ключа в массиве или 0
, если ничего не найдено.
Маби кто-то помогает.
Вы можете использовать его как:
var array = ['bananaman','spiderman','ironman','superman','batman','manman'];
var getLast = max(array);
if(getLast !== 0)
alert(getLast); // manman