如果数组中没有字符串则返回0 - JS

时间:2017-09-01 03:52:48

标签: javascript arrays

我这里有一个函数,它取一个数组中最小的数字。

我所做的是,我只使用typeof属性过滤掉了数字,并比较了Infinity中的值。

现在,如果数组为空,它将返回0。

但是,如果数组只包含字符串或其他数据类型,则它将返回Infinity。

这是我的代码:

function findSmallestNumberAmongMixedElements(arr) {

  var smallestNum = Infinity;

  if(arr.length !== 0){
   for(var i = 0; i < arr.length; i++){
     if(typeof arr[i] === 'number' && arr[i] < smallestNum){
         smallestNum = arr[i];
     } 
   }
     return smallestNum;
  } 
  return 0;
}


var output = findSmallestNumberAmongMixedElements(['sam', 3, 2, 1]);
console.log(output); // --> 4

如果数组中没有数字,它也必须返回0。

知道我在这里做错了什么吗?

4 个答案:

答案 0 :(得分:2)

可能有一些更优雅的方法来解决这个问题。但这可以解决你的错误。

function findSmallestNumberAmongMixedElements(arr) {

  var smallestNum = Infinity;
  var numberFound = false

   for(var i = 0; i < arr.length; i++){
     if(typeof arr[i] === 'number' && arr[i] < smallestNum){
         smallestNum = arr[i];
         numberFound = true
     } 
   }
    if(numberFound)
      return smallestNum;

  return 0;
}

答案 1 :(得分:0)

function findSmallestNumberAmongMixedElements(arr) {

  var smallestNum = Infinity;

  if(arr.length !== 0){
   for(var i = 0; i < arr.length; i++){
     if(typeof arr[i] === 'number' && arr[i] < smallestNum){
         smallestNum = arr[i];
     } 
   }
     return smallestNum == Infinity? 0 : smallestNum; // if smallest doesn't change return 0
  } 
  return 0;
}


var output = findSmallestNumberAmongMixedElements(['sam', 3, 2, 1]);
console.log(output);

答案 2 :(得分:0)

问题在于你是特殊的 - 使用行

来填充空数组的情况
if(arr.length !== 0){

删除它。然后,如果您想将结果Infinity强制为0,请在结尾处执行此操作。

function findSmallestNumberAmongMixedElements(arr) {

  var smallestNum = Infinity;

  for(var i = 0; i < arr.length; i++){
    if(typeof arr[i] === 'number' && arr[i] < smallestNum){
       smallestNum = arr[i];
    } 
  }

  return isFinite(smallestNum) ? smallestNum : 0;
}

但是,使用filter过滤非数字更简单,并使用Math.min计算最小值。这也更容易修复一个&#34; bug&#34;在上面的代码中,对于0等输入,它将产生[Infinity, "foo", Infinity]。我不确定您是否愿意在这种情况下返回0Infinity。假设您确实要返回0,那么

function findSmallestNumberAmongMixedElements(arr) {
  var nums = ...arr.filter(elt => typeof elt === 'number');

  return nums.length ? Math.min(...nums) : 0;
}

答案 3 :(得分:-1)

您可以使用奇怪的方式使用Array#reduce和Array#filter

首先,过滤掉非数字

第二次减少此过滤后的数组,初始值为0 - 如果数组长度为零,则reduce将返回0

&#13;
&#13;
function findSmallestNumberAmongMixedElements(arr) {
    var smallestNum = Infinity;
    return arr.filter(item => typeof item == 'number').reduce((min,item) => {
        if(item < smallestNum) smallestNum = item;
        return smallestNum;
    }, 0);
}
console.log(findSmallestNumberAmongMixedElements([]));
console.log(findSmallestNumberAmongMixedElements(['1','2','3']));
console.log(findSmallestNumberAmongMixedElements([1,2,3]));
console.log(findSmallestNumberAmongMixedElements(['1',2,3]));
&#13;
&#13;
&#13;