2013-05-22 2 views
2

У меня есть массив, который мне нужен, чтобы найти самое высокое значение, поэтому, применяя его к Highchart, я могу покрасить фон, если он превышает некоторый динамический номер, вводимый пользователем.javascript array find максимальное значение

Мой код выглядит следующим образом:

<div id="highest"></div> 

var array = { 
    data: [123, 234, 456, 789], 
    data: [321, 654, 987], 
    data: [963, 852, 741] 
}; 

for (var i=0; i < array.data.length; i++){ 
    var m = Math.max.apply(Math, array.data); 
    $('#highest').append('<div>'+m+'</div>'); 
} 

все, что я получаю номер

<div>963</div> 
<div>963</div> 
<div>963</div> 
+0

Не кажется ли вам, что это странно, что вы зацикливание, но ничего с 'i' не делают? Используйте 'for in' для перебора объекта. И дать уникальные ключи – Ian

+0

'i' используется в условиях цикла, так что это не совсем ничего не делает –

+2

Считаете ли вы странным, что ваши ключи из ваших существ все одинаковы, переписывая друг друга -> [Fiddle] (http: // jsfiddle.net/Juy8H /) – adeneo

ответ

4

Ваш array переменная не является массивом ([]), это объект ({}). У вас есть несколько элементов в объекте с ключом data, но допускается только одно значение за ключ.

Таким образом, вы в основном написал это:

var array = { 
    data: [963, 852, 741] 
}; 

Может быть, вы хотите что-то вроде этого?

var array = [ 
    {data: [123, 234, 456, 789]}, 
    {data: [321, 654, 987]}, 
    {data: [963, 852, 741]} 
]; 

var values = []; 
for (var i=1; i < array.length; i++) { 
    values.push.apply(values, array[i].data); 
} 
$('#highest').append('<div>' + Math.max.apply(Math, values) + '</div>'); 

или избавиться от data полностью и просто сделать это массив массивов.

+1

ok - когда я применил свой ответ к своему фактическому исходному массиву, он действительно сработал - ха-ха - пойдите, это то, что я изначально пытался, но мой примерный массив ошибочен. – jbolanos

2

Ну, это не массив, это объект с дублируемыми ключами, поэтому вы просто зацикливаете последний, который переопределяет все остальные.

Попробуйте http://jsbin.com/olahuq/2/edit

var obj = { 
    a: [123, 234, 456, 789], 
    b: [321, 654, 987], 
    c: [963, 852, 741] 
}; 

var max = []; 
for (var i in obj) { 
    max.push(Math.max.apply(0, obj[i])); 
} 

$('#highest').append('<div>'+ max.join('</div><div>') +'<div>'); 

Altough вы могли бы просто использовать массив объектов.

+0

К сожалению, я не могу изменить объект данных - он исходит из json, динамически сгенерированного сервером – jbolanos

+3

Тогда я предлагаю вам отслеживать проблему на сервере и исправлять ее там, прежде чем идти дальше. Дублированные ключи ошибочны, по определению ключ должен быть _unique_. – elclanrs

0

Вы используете несколько ключей с тем же именем, что не является действительным JavaScript (ну, код может все еще работать, но вы не получите ожидаемых результатов). Это легко исправить, хотя, просто использовать массив вместо:

var arr = [ 
    [123, 234, 456, 789], 
    [321, 654, 987], 
    [963, 852, 741] 
]; 

for (var i=0; i < arr.length; i++){ 
    var m = Math.max.apply(Math, arr[i]); 
    $('#highest').append('<div>'+m+'</div>'); 
} 

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

+0

Кто-нибудь хочет объяснить нисходящее? я пытаюсь решить дух вопроса, а не давать буквальные ответы на каждый заданный вопрос. – sgroves

+0

Да, не знаю, это кажется правильным ... – elclanrs

+1

Вы [содержались [в массиве – jbolanos

1

Не уверен, что вы пытаетесь сделать здесь. Эта переменная «array» определяется как объект. Объектные литералы в JavaScript нуждаются в уникальных ключах. Ваш последний массив, набранный «данными» в объекте «массив», является единственным, который получает интерпретатор.

Возможно, вы захотите?

var data = [ 
    [123, 234, 456, 789], 
    [321, 654, 987], 
    [963, 852, 741] 
]; 

for (var i=0; i < data.length; i++){ 
    var m = Math.max.apply(Math, data[i]); 
    $('#highest').append('<div>'+m+'</div>'); 
} 
2

Сначала сделайте правильный набор вложенных массивов. Затем вы можете использовать .map() сделать это:

var array = [ 
    [123, 234, 456, 789], 
    [321, 654, 987], 
    [963, 852, 741] 
]; 

var maxVals = array.map(function(a) { 
    return Math.max.apply(Math, a); 
}); 

Или так:

var maxVals = array.map(Function.apply.bind(Math.max, Math)); 
+0

Это настолько странно, что вы разместили это. Я буквально собирался ответить. Я пытался выяснить, как это сделать во втором случае, и придумал то же самое. http://jsfiddle.net/SW7Ym/. Так странно. – Ian

+1

@Ian: Great minds ...;) –

+0

Быстрый вопрос - есть ли причина, по которой вы использовали 'Function.apply' вместо' Function.prototype.apply'? Я всегда удивлялся, потому что я видел, как люди использовали 'Array.whatever' вместо' Array.prototype.whatever' – Ian

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