2017-06-22 45 views
1

嗨我创建一个函数,返回给定数组内的最小数字。如果数组包含没有数字,它应该返回0。混合元素小号 - JS

这里是我的功能:

function findSmallestNumberAmongMixedElements(arr){ 
     if(arr.length === 0 && typeof arr === 'string'){ 
     return 0; 
     } else{ 
     return Math.min.apply(null, arr); //min=1 
     } 
    } 
    var output = findSmallestNumberAmongMixedElements([4, 'lincoln', 9, 'octopus']); 
    console.log(output); // --> 4 

现在我的答案返回NAN而不是4.你有什么想法,我究竟做错了什么?

回答

2

typeof arr === "string"将永远是false如果你正在传递一个数组(无论数组是否包含字符串与该测试无关)。

你应该做的是首先筛选数字出用filter数组,然后调用Math.min过滤的阵列上:

function findSmallestNumberAmongMixedElements(arr) { 
 
    var onlyNumbers = arr.filter(e => typeof e === "number"); // filter out only items that are numbers 
 
    if(onlyNumbers.length === 0) return 0;     // if there is no numbers, return 0 
 
    return Math.min.apply(null, onlyNumbers);     // otherwise return the min of them 
 
} 
 

 
var output = findSmallestNumberAmongMixedElements([4, 'lincoln', 9, 'octopus']); 
 
console.log(output); // --> 4

+0

我喜欢你的解决方案,但是如果数组中没有项目,这将不会返回0吗? – Matt

+0

@Matt你说得对。我将为此添加代码。 –

2

您当前的功能可能会产生NaN你的时候尝试将Math.min应用于包含stringnumber值的输入数组。 Math.min只能处理数字输入,因此string的存在可能会导致它返回NaN错误值。

有一个简单的解决方案:从数组中滤除所有非number值。我们可以检查过滤数组的长度,看看是否有非数字值,如果有的话,请不用担心。

function findSmallestNumberAmongMixedElements(arr) { 
 
    var filtered = arr.filter(function(el) { 
 
    return typeof el == 'number'; 
 
    }); 
 
    if (filtered.length > 0) { 
 
    return Math.min.apply(Math, filtered); 
 
    } else { 
 
    return 0; 
 
    } 
 
} 
 

 
[ 
 
    [4, 'lincoln', 9, 'octopus'], // 4 
 
    [],       // 0 
 
    ['a', 3, 2],     // 2 
 
    ['h', 'i'],     // 0 
 
    ['-3', 3],     // 3 
 
].forEach(function(input) { 
 
    console.log(input, findSmallestNumberAmongMixedElements(input)); 
 
});

1

在你Math.min.apply(null, arr),你得到NaN因为有数组中的字符串。您的typeof arr === 'string'不循环您的数组以排除数组中的字符串值

你需要做的,实现你的目标是什么可能只是做一个for循环或forEach循环:

function findSmallestNumberAmongMixedElements(arr){ 
    var min = Infinity; 

    // if argument is not array or array has no value 
    if (arr.constructor !== Array || arr.length === 0){ 
     min = 0; 
     return min; 
    } 

    /* for loop */ 
    for (var i = 0, len = arr.length; i < len; i++){ 
     if (arr[i] === 0 || typeof arr[i] !== 'number') continue; 
     min = Math.min(min, arr[i]); 
    } 

    /* forEach loop */ 
    arr.forEach(function(value, index){ 
     if (value === 0 || typeof value !== 'number') return; 
     min = Math.min(min, value); 
    }); 

    return min; 
} 

var output = findSmallestNumberAmongMixedElements([4, 'lincoln', 9, 'octopus']); 
console.log(output); // --> 4 
1

我想你给它之前应该过滤你的阵列Math.min

请尝试以下内容

function isNumber (obj) { 
    return obj!== undefined && typeof(obj) === 'number' && !isNaN(obj); 
} 

function smallestInMixedArray (arr) { 
    if (arr.length === 0 || !arr.filter) { 
     return 0; 
    } else { 
     arr = arr.filter(isNumber) 
     return Math.min.apply(null, arr); //min=1 
    } 
} 

var output = smallestInMixedArray([4, 'lincoln', 9, 'octopus']); 
console.log(output); // --> 4