Reputation:
I created a function here that needs to:
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
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
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
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
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
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