2

我有一个数组,我需要找到它的最大值,所以当我将它应用到 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>
4

6 回答 6

4

首先制作一个适当的嵌套数组集。然后你可以用它.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));
于 2013-05-22T22:39:32.803 回答
4

你的array变量不是一个数组([]),它是一个对象({})。您在具有 key 的对象中有多个项目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它,只让它成为一个数组数组。

于 2013-05-22T21:59:26.803 回答
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>');

尽管您可以只使用一组对象。

于 2013-05-22T22:01:22.583 回答
1

不知道你想在这里做什么。该“数组”变量被定义为一个对象。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>');
}
于 2013-05-22T22:06:38.290 回答
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>');
}

可以使用对象来执行此操作,但我看不出有任何理由,除非您从服务或其他东西中读取此数据并且无法更改其格式。

于 2013-05-22T22:05:14.863 回答
0

我只想添加另一种更简化的方式。

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));

最后,您还可以用排序方法替换后者 reduce:

var max = Object.values(obj)
      .reduce((a, d) => a.concat(d), [])
      .sort((l, r) => l - r)
      .pop();
于 2019-05-16T08:41:32.830 回答