[英]javascript array find highest value
我有一個數組,我需要找到最高值,所以當我將它應用於Highchart我可以為背景着色,如果它超過用戶輸入的動態數字。
我的代碼看起來像這樣:
<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>
您的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
,只是使它成為一個數組數組。
首先制作一個合適的嵌套數組。 然后你可以使用.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));
好吧,那不是一個數組,它是一個帶有重復鍵的對象,所以你只是循環覆蓋所有其他鍵的最后一個。
試試這個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>');
盡管你可以使用一組對象。
不知道你在這里想做什么。 該“數組”變量被定義為一個對象。 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>');
}
您正在使用具有相同名稱的多個密鑰,這些密鑰不是有效的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>');
}
您可以使用對象執行此操作,但我認為沒有任何理由,除非您從服務或其他內容中讀取此數據並且無法更改其格式。
我只想添加另一種更簡化的方式。
var obj = {
a: [123, 234, 456, 789],
b: [321, 654, 987],
c: [963, 852, 741]
};
var max = Math.max.apply(0, [].concat.apply([], Object.values(obj)));
然而,這可能是為了在生產代碼中使用混淆,我寧願使用reduce
代替更好的可讀性。
var max = Object.values(obj)
.reduce((a, d) => a.concat(d), [])
.reduce((p, c) => Math.max(p, c));
最后,您還可以使用sort方法替換后者reduce:
var max = Object.values(obj)
.reduce((a, d) => a.concat(d), [])
.sort((l, r) => l - r)
.pop();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.