10

我想从数组中获取最小值。如果数据包含null值,则Math.min.apply返回0null。请参阅此 JSFiddle 示例。即使数组中存在空值,如何获得真正的最小值?

代码(与 JSFiddle 示例相同):

var arrayObject= [ {"x": 1, "y": 5}, {"x": 2, "y": 2}, {"x": 3, "y": 9}, {"x": 4, "y": null}, {"x": 5, "y": 12} ];

var max = Math.max.apply(Math, arrayObject.map(function(o){return o.y;}));
var min = Math.min.apply(Math, arrayObject.map(function(o){return o.y;}));

$("#max").text(max);
$("#min").text(min);
4

7 回答 7

12

嗯, 的数值null0。如果您不想null考虑值,则必须将它们过滤掉:

var values = arrayObject.map(function(o){
    return o.y;
}).filter(function(val) {
    return val !== null
});

参考Array#filter

于 2012-08-05T16:02:01.927 回答
8

Felix 解决方案的替代方案:分别将 min 和 max 调用null视为+-无穷大。

var max = Math.max.apply(Math, arrayObject.map(function(o) {
    return o.y == null ? -Infinity : o.y;
}));
var min = Math.min.apply(Math, arrayObject.map(function(o) {
    return o.y == null ? Infinity : o.y;
}));
于 2012-08-05T16:05:12.700 回答
4

我认为,通过直接应用逻辑,该函数不会映射属性、过滤null值和应用Math.min/max(如其他答案所建议的),而是会为您节省一些时间和代码:reduce

var arrayObject= [ {"x": 1, "y": 5}, {"x": 2, "y": 2}, {"x": 3, "y": 9}, {"x": 4, "y": null}, {"x": 5, "y": 12} ];
var min = var arrayObject.reduce(function(m, o) {
    return (o.y != null && o.y < m) ? o.y : m;
}, Infinity);
var max = var arrayObject.reduce(function(m, o) {
    return (o.y != null && o.y > m) ? o.y : m;
}, -Infinity);
于 2012-08-05T16:13:24.513 回答
0
var validArray = $.grep( arrayObject, function(item, _){
                    return item.y != null;
               });
//That gives a new array without null values for "y"

现在做..

var min = Math.min.apply(Math, validArray.map(function(o){return o.y;}));
于 2012-08-05T16:03:17.727 回答
0

这些是我在 2020 年一直在使用的。代码略短。

const min = (values) => values.reduce((m, v) => (v != null && v < m ? v : m), Infinity);
const max = (values) => values.reduce((m, v) => (v != null && v > m ? v : m), -Infinity);

const arrayObject = [
  { x: 1, y: 5 },
  { x: 2, y: 2 },
  { x: 3, y: 9 },
  { x: 4, y: undefined },
  { x: 5, y: 12 },
];
const yValues = arrayObject.map((item) => item.y)

console.log(yValues)
console.log('min', min(yValues))
console.log('max', max(yValues))

于 2020-10-01T20:38:18.830 回答
0

使用 lodash:

_.min([5, null]) = 5
于 2021-09-21T17:54:45.370 回答
-1

你试过 min 函数中的条件(三元)运算符吗

如果 Value 为 Null ?“一个不属于最小标准的大值”:“原始值”)

希望这可以帮助!

于 2019-07-16T10:49:35.380 回答