user8492975
user8492975

Reputation:

Returning the largest Number - JS

I created a function here that needs to:

  1. Return the largest 'number' in the array.
  2. Return 0 if array is empty
  3. Return 0 if there are no 'number' in the array.
  4. Return the highest negative number if there is one in the array.

Right now, it work on negative numbers and empty array, however for some reason it won't show up the largest number.

Here's my function:

function largestNumber(arr) {

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

  if (arr.length === 0) {
    return 0;
  }

}

var output1 = largestNumber([3, "word", 5, "up", 3, 1]);
console.log(output1); // --> must be 5 but display 3 (as the largest)

var output2 = largestNumber([-1, -5, "word", -3]);
console.log(output2); // --> -1

var output3 = largestNumber([]);
console.log(output3); // --> 0

var output4 = largestNumber(["word", 3, 5, 3, "wordy", "up", 1, 5]);
console.log(output4); // --> must be 5 instead returned undefined

Any idea what's causing this? How can I improve my code to get the expected results?

Upvotes: 0

Views: 301

Answers (5)

Nina Scholz
Nina Scholz

Reputation: 386868

You could loop the array and check against undefined or if the value is greater than the storte value.

function largestNumber(array) {
    return array.reduce(function (r, a) {
        return typeof a === 'number' && (r === undefined || r < a) ? a : r;
    }, undefined) || 0;
}

console.log(largestNumber([3, "word", 5, "up", 3, 1]));             //  5
console.log(largestNumber([-1, -5, "word", -3]));                   // -1
console.log(largestNumber([]));                                     //  0
console.log(largestNumber(["word", 3, 5, 3, "wordy", "up", 1, 5])); //  5

With a for loop.

function largestNumber(array) {
    var i, longestNumber;
    for (var i = 0; i < array.length; i++) {
        if (
            typeof array[i] === 'number' &&
            (longestNumber === undefined || longestNumber < array[i])
        ) {
            longestNumber = array[i];
        }
    }
    return longestNumber || 0;
}

console.log(largestNumber([3, "word", 5, "up", 3, 1]));             //  5
console.log(largestNumber([-1, -5, "word", -3]));                   // -1
console.log(largestNumber([]));                                     //  0
console.log(largestNumber(["word", 3, 5, 3, "wordy", "up", 1, 5])); //  5

Upvotes: 0

rakwaht
rakwaht

Reputation: 3967

I adapted the code of @baao from its answer to adress also request number 4

  function largestNumber(arr) {
    arr = arr.filter(v => !isNaN(v));
    negative = arr.filter(v => v < 0);
    return negative.length === 0 ? Math.max(0, ...arr) : Math.min(...arr)
  }

  console.log(largestNumber(["word", 3, 5, 3, "wordy", "up", 1, 5]));
  console.log(largestNumber([-1, -2]));
  console.log(largestNumber([3, "word", 5, "up", 3, 1]));
  console.log(largestNumber(["word", "up"]));
  console.log(largestNumber([-1, -5, "word", -3]));
  console.log(largestNumber([]));
  console.log(largestNumber(["word", 3, 5, 3, "wordy", "up", 1, 5]));

Upvotes: 0

baao
baao

Reputation: 73301

Just filter the array to retain numbers only, then use Math.max

function largestNumber(arr) {
    let n = arr.some(e => e<0);
    arr = arr.filter(v => n ? !isNaN(v) && v<0 : !isNaN(v));
    return arr.length === 0 ? 0 : Math.max(...arr);
}

console.log(largestNumber(["word", 3, 5, 3, "wordy", "up", 1, 5]));
console.log(largestNumber([-1, -2]));
console.log(largestNumber([3, "word", 5, "up", 3, 1]));
console.log(largestNumber([-1, -5, "word", -3]));
console.log(largestNumber([]));
console.log(largestNumber(["word", 3, 5, 3, "wordy", "up", 1, 5]));
console.log(largestNumber([-8, -4, 1, 5]));

Upvotes: 2

Jamiec
Jamiec

Reputation: 136239

These two consecutive lines in your function should give you a clue to the problem:

var longestNumber = arr[i];
if(arr[i] > longestNumber){

You're setting the current number as the longest number, and then comparing it to the same number.

Simply move the first line above outside the for loop and default it to zero. You'll also have to move the return outside the loop and change your if logic slightly to account for all your requirements

function largestNumber(arr) {
   var longestNumber = -Infinity;
  for (var i = 0; i < arr.length; i++) {
    if (typeof arr[i] === 'number') {
      
      if (arr[i] > longestNumber) {
        longestNumber = arr[i];
      }
    }
  }

  if (longestNumber == -Infinity) {
    longestNumber = 0;
  }  
   return longestNumber;
}

var output1 = largestNumber([3, "word", 5, "up", 3, 1]);
console.log(output1); // --> must be 5 but display 3 (as the largest)

var output2 = largestNumber([-1, -5, "word", -3]);
console.log(output2); // --> -1

var output3 = largestNumber([]);
console.log(output3); // --> 0

var output4 = largestNumber(["word", 3, 5, 3, "wordy", "up", 1, 5]);
console.log(output4); // --> must be 5 instead returned undefined

Upvotes: 2

campovski
campovski

Reputation: 3163

   if(typeof arr[i] ===  'number'){
     var longestNumber = arr[i];
     if(arr[i] > longestNumber){
       longestNumber = arr[i];
     }

Here you set var longestNumber = arr[i] in each execution of loop which means that at the end the function will return the last element that was a number. Instead, do this:

function largestNumber(arr) {
    var longestNumber = -Infinity;
    for (var i = 0; i < arr.length; i++) {
        if (typeof arr[i] === 'number' && arr[i] > longestNumber) {
            longestNumber = arr[i];
        }
    if (longestNumber > -Infinity) {
        return longestNumber;
    }
    return 0;
}

Upvotes: 0

Related Questions