Javascript Max在创建数字数组后返回数组上的Nan

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

我用Javascript创建了一个数组,它应该是所有数字。当我对其使用
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