Javascript Math.min.apply为null返回0
我想从数组中获取最小值。如果数据包含Javascript Math.min.apply为null返回0,javascript,Javascript,我想从数组中获取最小值。如果数据包含null值,Math.min.apply为null值返回0。请看。即使数组中存在null值,如何获得真正的最小值 代码(与JSFIDLE示例中的代码相同): 嗯,null的数值是0。如果不希望考虑null值,则必须将其过滤掉: var values = arrayObject.map(function(o){ return o.y; }).filter(function(val) { return val !== null }); 参考: 现
null
值,Math.min.apply
为null
值返回0
。请看。即使数组中存在null值,如何获得真正的最小值
代码(与JSFIDLE示例中的代码相同):
嗯,
null
的数值是0
。如果不希望考虑null
值,则必须将其过滤掉:
var values = arrayObject.map(function(o){
return o.y;
}).filter(function(val) {
return val !== null
});
参考:
现在做
var min = Math.min.apply(Math, validArray.map(function(o){return o.y;}));
Felix解决方案的替代方案是:分别将
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;
}));
我认为,与其映射属性,过滤掉
null
值,然后应用Math.min/max
(正如其他答案所建议的那样),通过直接应用逻辑,可以节省一些时间和代码:
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);
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(函数(m,o){
返回值(o.y!=null&&o.ym)?o.y:m;
},-无穷大);
您是否在min函数中尝试了条件(三元)运算符
(如果值为空?“一个大值,因此不符合最低标准”:“原始值”)
希望这有帮助 这些是我在2020年使用的。略短的代码
const min=(values)=>values.reduce((m,v)=>(v!=null&&vvalues.reduce((m,v)=>(v!=null&&v>m?v:m),-Infinity);
常量数组对象=[
{x:1,y:5},
{x:2,y:2},
{x:3,y:9},
{x:4,y:undefined},
{x:5,y:12},
];
常量yValues=arrayObject.map((项)=>item.y)
console.log(Y值)
console.log('min',min(y值))
log('max',max(yvalue))
您的示例中没有JSON。。。修复。Math.min
函数对每个数组元素执行(内部函数)ToNumber()
,从而强制值为Number。我们知道强迫很糟糕:P
@ŠimeVidas简单地将属性省略将使其未定义
,这反过来会变成NaN
,它很容易被过滤掉。filter(isFinite)
@Esailija是的,这将是一个很好的解决方案。或者将null
映射到无穷大
。将节省一些字节和额外的n
函数调用。@Prinzhorn:是的,那也行。。。只需将它们再次映射为max
到-无穷大。这取决于你将如何处理这些数据,对吗?我仍然得到0,看看这里的forked版本:@Jernej:您只使用了max
的过滤值,而不是min
。我从来没有见过无限被使用过。如果可以的话,我会投两次票是否有理由在数字
上使用常量,文字无限
(和-无限
)不是更容易吗?有趣的解决方案。用O表示法的性能增益是多少?O(n)
与任何其他解决方案都不一样。Landau表示法?没有一个但是通过不创建中间的arraysAh,可以节省一些函数调用和内存。谢谢你的解释。
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;
}));
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);