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怎么了