Javascript Max在创建数字数组后返回数组上的Nan
我用Javascript创建了一个数组,它应该是所有数字。当我对其使用Javascript Max在创建数字数组后返回数组上的Nan,javascript,arrays,max,Javascript,Arrays,Max,我用Javascript创建了一个数组,它应该是所有数字。当我对其使用Math.max时,函数返回NaN。我被难住了。 首先,我知道当其中一个参数无法转换为数字时,Math.max返回NaN,因此我认为这种情况正在发生。我不明白那是什么 这里d是一个对象数组。对象是键值对。我想将d数组中每个对象的所有值放入一个新数组中,然后找到最大值。下面是我如何创建新数组valsarr: var valsarr = []; d.map(function(row){ Object.keys(row).
Math.max
时,函数返回NaN
。我被难住了。
首先,我知道当其中一个参数无法转换为数字时,Math.max
返回NaN
,因此我认为这种情况正在发生。我不明白那是什么
这里d
是一个对象数组。对象是键值对。我想将d
数组中每个对象的所有值放入一个新数组中,然后找到最大值。下面是我如何创建新数组valsarr
:
var valsarr = [];
d.map(function(row){
Object.keys(row).forEach(function(key) {
row[key] = Number(row[key]);
valsarr.push(Number(row[key]));
});
});
我知道使用Number
两次是多余的,但我添加了第二次是为了格外小心。我尝试了parseInt
和+
替换它,得到了相同的结果。
然后我尝试获取该数组的最大值并打印:
var mymax = Math.max.apply(Math, valsarr)
console.log(mymax);
它打印NaN
作为调试过程的一部分,我尝试过滤数组以查找其中的非数字,但什么也没有得到。然而,我的任务代码也可能有错误。这是:
function isNotNumber(value) {
return (typeof(value) !== "number");
}
var badarr = valsarr.filter(isNotNumber);
console.log('Filtered Array\n', badarr);
它打印长度为0的数组。我相信这意味着它在数组中找不到非数值
还有两个注意事项:d
中的原始数据包含数千个值。它来自.csvs。所以我不想通过搜索所有的值来找到那些不是数字的值。我可以很容易地看到原始的d
对象和valsarr
数组中确实有数字。第二,当我加载我正在使用的一个.csv,但不加载任何其他的.csv时,它就会工作
但是,对于任何一个.csv,当我扫描它们进行检查时,d
和valsarr
都至少包含一些数字,所以第一个代码块至少每次都在做一些事情
任何帮助都将不胜感激 也许你可以作弊一点,然后在设置值的时候通过检查来找到行为不好的值:
Object.keys(row).forEach(function(key) {
row[key] = +row[key];
valsarr.push(row[key]);
if (Math.max(row[key]) !== row[key]) {
console.log(row);
}
}
然后,您可以看到有问题的行…也许您可以作弊一点,并在设置值时通过检查来查找行为不正确的值:
Object.keys(row).forEach(function(key) {
row[key] = +row[key];
valsarr.push(row[key]);
if (Math.max(row[key]) !== row[key]) {
console.log(row);
}
}
然后您可以看到有问题的行…您可以使用筛选函数从数组中删除NaN
var valsarr = [];//initialize data in array
var result= valsarr.filter(v => ! isNaN(v));
您可以使用筛选函数从阵列中删除NaN
var valsarr = [];//initialize data in array
var result= valsarr.filter(v => ! isNaN(v));
接受多个参数,而不是数组。您可以使用spread(ES7)
或者您可以使用“应用”:
Math.max.apply(null,[1,2,3,4])
确保从数组中取出任何不是laxydeveloper建议的数字的内容:
Math.max.apply(null,array.filter(x=>!isNaN(x))
在您的代码中,它将如下所示:
var d=[
{p:“你好”},
{d:2},
{q:7},
{其他:1,最高:10},
{q:7}
];
var highest=Math.max.apply(
无效的
d、 地图(
行=>
Object.keys(行).map(
键=>
编号(行[键])
)
).将(//将数组[[1,2],[2,3]]的数组展平为[1,2,3,4]
(全部,项目)=>全部混凝土(项目),
[]
).filter(//取出所有非数字
x=>!伊斯南(x)
)
);
log(“最高:”,最高)代码>接受多个参数,而不是数组。您可以使用spread(ES7)
或者您可以使用“应用”:
Math.max.apply(null,[1,2,3,4])
确保从数组中取出任何不是laxydeveloper建议的数字的内容:
Math.max.apply(null,array.filter(x=>!isNaN(x))
在您的代码中,它将如下所示:
var d=[
{p:“你好”},
{d:2},
{q:7},
{其他:1,最高:10},
{q:7}
];
var highest=Math.max.apply(
无效的
d、 地图(
行=>
Object.keys(行).map(
键=>
编号(行[键])
)
).将(//将数组[[1,2],[2,3]]的数组展平为[1,2,3,4]
(全部,项目)=>全部混凝土(项目),
[]
).filter(//取出所有非数字
x=>!伊斯南(x)
)
);
log(“最高:”,最高)
您应该能够在我在下面的代码中创建的valsArray
上运行Math.max()函数,没有任何问题
//您的代码:
/*var VALARR=[];
d、 映射(函数(行){
//这就是您所做的,但实际上您没有将任何内容返回给map函数,因此您没有在'd'设置中创建任何新内容,也没有将.map()函数的返回值赋给任何内容。
Object.keys(行).forEach(函数(键){
行[键]=编号(行[键]);
VALARR.push(数字(行[键]);
});
});*/
//创建“d”的模拟数据集,因为您没有提供它。
变量d=[
{a:'1',b:'2',c:'3'},
{a:'1',b:'2',c:'test'},//这应该失败。
{a:'1',b:'2',c:'3'},
{a:'1',b:'2',c:'3'},
{a:'1',b:'2',c:'3'}
]
//这就是我认为您正在尝试的:
//我之所以使用concat.apply()方法,是因为.map()方法中的Object.values()创建了一个包含这些值的新数组,所以我们需要将它们连接在一起
var valsArray=[].concat.apply([],d.map((行)=>{
返回Object.values(行)
.filter((val)=>{
log('引起故障的行:',isNaN(parseInt(val)),row,val);
return!isNaN(parseInt(val));
})
.map((val)=>parseInt(val))
}));
您应该能够在我在下面的代码中创建的valsArray
上运行Math.max()函数,没有任何问题
//您的代码:
/*var VALARR=[];
d、 映射(函数(行){
//这就是您所做的,但实际上您没有将任何内容返回给map函数,因此您没有在'd'设置中创建任何新内容,也没有将.map()函数的返回值赋给任何内容。
Object.keys(行).forEach(函数(键){
行[键]=编号(行[键]);
VALARR.push(数字(行[键]);
});
});*/
//创建“d”的模拟数据集,因为您没有提供它。
变量d=[
{a:'1',b:'2',c:'3'},
{a:'1',b:'2',c:'test'},//这应该失败。
{a:'1',b:'2',c:'3'},
{a:'1',b:'2',c:'3'},
{a:'1',b:'2',c:'3'}
]
//这就是我认为您正在尝试的:
//我之所以使用concat.apply()方法,是因为Object.valu