Javascript 为什么将数字作为字符串传入数组会导致错误的结果?

Javascript 为什么将数字作为字符串传入数组会导致错误的结果?,javascript,Javascript,我构建了一个函数,允许您通过数组,它成功返回第二高和第二低的数字。但是,我对错误处理还不熟悉,不明白为什么会失败: getNos([5,"5",8]); 它在传入getNos([5,5,8])时工作正常。;或者传递数组,比如getNos([“5”,8]) 有人能解释一下这里发生了什么以及如何修复它吗?感谢您的帮助-功能代码如下: function getNos(arr){ if (!Array.isArray(arr) || arr.length == 0 || arr.length ==

我构建了一个函数,允许您通过数组,它成功返回第二高和第二低的数字。但是,我对错误处理还不熟悉,不明白为什么会失败:

getNos([5,"5",8]);
它在传入
getNos([5,5,8])时工作正常。
;或者传递数组,比如
getNos([“5”,8])

有人能解释一下这里发生了什么以及如何修复它吗?感谢您的帮助-功能代码如下:

function getNos(arr){

if (!Array.isArray(arr) || arr.length == 0 || arr.length == 1 || (arr.every(c => !isNaN(c)) == false)) {
    throw 'Invalid Input';
} else {

    var result;
    var uniqueVals = Array.from(new Set(arr));
    var highest = highestVal(arr);
    var lowest = lowestVal(arr);

    if (uniqueVals.length == 1) {
        result = arr[0] + " " + arr[0];
    } else if (arr.length == 2 || uniqueVals.length == 2) {
        result = highest + " " + lowest;
    } else {
        arr = arr.filter(item => ((item !== highest) && (item !== lowest)));
        var secondHighest = highestVal(arr);
        var secondLowest = lowestVal(arr);

        if (arr.length == 1) {
            arr = arr.slice(arr.indexOf(secondHighest));
            result = highestVal(arr);
        } else {
            result = secondLowest + " " + secondHighest;
        }
    }
    return result;
}

function highestVal(a) { return a.reduce((a, b) => a > b ? a : b ) };
function lowestVal(a) { return a.reduce((a, b) => a < b ? a : b ) };
}
函数getNos(arr){
如果(!Array.isArray(arr)| | arr.length==0 | | arr.length==1 | |(arr.every(c=>!isNaN(c))==false)){
抛出“无效输入”;
}否则{
var结果;
var uniqueVals=Array.from(新集合(arr));
var最高=最高值(arr);
最低风险值=最低风险值(arr);
if(uniqueVals.length==1){
结果=arr[0]+“”+arr[0];
}else if(arr.length==2 | | uniqueVals.length==2){
结果=最高+最低;
}否则{
arr=arr.filter(item=>((item!==最高)和&(item!==最低));
var第二高=最高值(arr);
var secondLowest=最低值(arr);
如果(arr.length==1){
arr=arr.slice(arr.indexOf(次高));
结果=最高值(arr);
}否则{
结果=第二最低+第二最高;
}
}
返回结果;
}
函数highestVal(a){返回a.reduce((a,b)=>a>b?a:b)};
函数lowestVal(a){返回a.reduce((a,b)=>a
简单的修复方法是在创建集合之前将值映射到数字,以避免集合中的字符串和数字具有相同的数值

改变

var uniqueVals = Array.from(new Set(arr));


简单的解决方法是在创建集合之前将值映射到数字,以避免集合中的字符串和数字都具有相同的数值

改变

var uniqueVals = Array.from(new Set(arr));


仔细遵循逻辑
var uniqueVals=Array.from(新集合(arr))
。当您使用数组时,如
[5,5,8]
vs
[5,5,8]
vs
[“5,8]
,此行将返回什么

集合
存储
类型的唯一值
<代码>“5”
字符串类型
,而5为
数字类型
highestVal
lowerstval
函数可以比较
“5”
8
,这没有问题,但是由于数组可以包含
字符串或
数字
作为5或8,那么您将得到有趣的返回值

要解决此问题,在将
arr
传递到
Set
之前,需要将所有值转换为单个类型,最好是
number


让numberArr=arr.map(el=>+el)
是一种方法,但您可能需要更好的数据验证。

仔细遵循逻辑
var uniqueVals=Array.from(new Set(arr))
。当您使用数组时,如
[5,5,8]
vs
[5,5,8]
vs
[“5,8]
,此行将返回什么

集合
存储
类型的唯一值
<代码>“5”
字符串类型
,而5为
数字类型
highestVal
lowerstval
函数可以比较
“5”
8
,这没有问题,但是由于数组可以包含
字符串或
数字
作为5或8,那么您将得到有趣的返回值

要解决此问题,在将
arr
传递到
Set
之前,需要将所有值转换为单个类型,最好是
number


让numberrarr=arr.map(el=>+el)
是一种方法,但您可能需要更好的数据验证。

函数不会因为抛出错误而失败。对于这些类型的问题,请添加“预期结果”的示例

在JavaScript中比较字符串和数字时,您依赖于隐式强制来处理比较。在这种情况下,它不会抛出、出错或破坏任何内容,因为JavaScript会将字符串转换为数字并进行比较(除非它是严格的等式===也会检查类型)

结果是否应该基于传入的内容?或者在输入仅针对数字进行过滤之后。或者输入是否可以转换为有效数字

对于有效数字的过滤器。按如下方式筛选输入

  arr = arr.filter(data => typeof data === 'number')
在将值转换为数字并删除无法转换的值的情况下

  arr = arr.reduce(((acc, el) => {
                       const num = Number(el);
                       if (!Number.isNaN(num)) acc.push(num);
                       return acc;
                     }), []);

函数不会因为抛出错误而失败。对于这些类型的问题,请添加“预期结果”的示例

在JavaScript中比较字符串和数字时,您依赖于隐式强制来处理比较。在这种情况下,它不会抛出、出错或破坏任何内容,因为JavaScript会将字符串转换为数字并进行比较(除非它是严格的等式===也会检查类型)

结果是否应该基于传入的内容?或者在输入仅针对数字进行过滤之后。或者输入是否可以转换为有效数字

对于有效数字的过滤器。按如下方式筛选输入

  arr = arr.filter(data => typeof data === 'number')
在将值转换为数字并删除无法转换的值的情况下

  arr = arr.reduce(((acc, el) => {
                       const num = Number(el);
                       if (!Number.isNaN(num)) acc.push(num);
                       return acc;
                     }), []);

“错误结果”是什么?当传入[…]或像[…]这样传入数组时,它可以正常工作。那么什么时候它不工作?什么是“错误的结果”?当传入[…]或像[…]这样的数组时,它工作正常。那么什么时候不起作用?为什么?您是否愿意解释一下您的代码是做什么的,以及它将如何解决OP的问题?因为字符串“5”和数字5将在setI see中创建单独的值。如果您通过
getNos([5,“4”,8])
,会发生什么?我不认为这是OP想要的…t怎么了