Using your function it seems to me you have not addressed the edge case where the sentence starts or ends with empty string
and not provided the sort function with a numeric value
(vs boolean one). For example:
function findShort(s) {
const stringArray = s.split(" "); // <-- no .trim()
const orderedArray = stringArray.sort((a, b) => {
return a.length - b.length; // - instead of >
})
return orderedArray[0].length;
}
console.log(findShort(" try set manually ")) // 0 is wrong here
If we address this via String.trim you get:
function findShort(s) {
const stringArray = s.trim().split(" ");
const orderedArray = stringArray.sort((a, b) => {
return a.length - b.length;
})
return orderedArray[0].length;
}
console.log(findShort(" try set manually ")) // 3 is correct now!
Using Array.sort is one way to achieve this and it would more or less something like this in its ES6 variant
:
let findShort = s => s
.trim() // <-- making sure we remove any spaces at start and end
.split(' ') // <-- get the words from the sentence
.sort((a, b) => a.length - b.length)[0] // <-- sort & take the 1st element
.length
console.log(findShort("in case users")) // 2
console.log(findShort(" try set manually ")) // 3
console.log(findShort("A great story")) // 1
You could also write your own function which would be more performant overall since it would not need to iterate over the array multiple times (split
/sort
or split
/map
/Math.min
etc).
Something like this:
let findShort = str => {
let t = '', r = str, s = str.trim()
for(let i=0; i<s.length; i++) {
!!s[i].trim()
? t += str[i]
: (r = t.length < r.length ? t : r, t='')
}
r = t.length < r.length ? t : r
return r.length
}
console.log(findShort("in case users")) // 2
console.log(findShort(" try set manually ")) // 3
console.log(findShort("A great story")) // 1
Where you would loop one time only
and keep track of the last word. You would keep checking if the new one is shorter during each for loop iteration
by simply checking the lengths. If it is then that becomes your last word etc.