I have this challenge, which consists on:
For example:
Should return
groupIt(['hola', 'adios', 'chao', 'hemos', 'accion'])
// Should return
{
a: [ "adios", "accion" ]
c: [ "chao" ]
h: [ "hola", "hemos" ]
}
This is my answer, it returns the expected object, but doesn't pass the test in the page:
function groupIt(arr) {
let groups = {}
let firstChar = arr.map(el=>el[0])
let firstCharFilter = firstChar.filter((el,id)=>{
return firstChar.indexOf(el)===id
})
firstCharFilter.forEach(el=>{
groups[el]=[]
})
firstCharFilter.forEach(char=>{
for(let word of arr) {
if(word[0]==char) {
groups[char].push(word)
}
}
})
return groups
}
groupIt(['hola', 'adios', 'chao', 'hemos', 'accion'])
Where am I failing at?
Here the test: https://www.jschallenger.com/javascript-arrays/javascript-group-array-strings-first-letter
I ran your code as well as the test examples provided by JS challenger. I noticed that they where case sensitive. So although your code works well, if the words begin with upper case it will not pass certain cases. Attached is my version that passed all test examples.
If you add : .toLowerCase to the firstChar, I believe you will pass as well. Happy coding ;)
P.S if the image below does not work please let me know, I am just learning how to contribute to Stack Exchange, thanks.
const groupIt = (array) => {
let resultObj = {};
for (let i =0; i < array.length; i++) {
let currentWord = array[i];
let firstChar = currentWord[0].toLowerCase();
let innerArr = [];
if (resultObj[firstChar] === undefined) {
innerArr.push(currentWord);
resultObj[firstChar] = innerArr
}else {
resultObj[firstChar].push(currentWord)
}
}
return resultObj
}
console.log(groupIt(['hola', 'adios', 'chao', 'hemos', 'accion']))
console.log(groupIt(['Alf', 'Alice', 'Ben'])) // { a: ['Alf', 'Alice'], b: ['Ben']}
console.log(groupIt(['Ant', 'Bear', 'Bird'])) // { a: ['Ant'], b: ['Bear', 'Bird']}
console.log(groupIt(['Berlin', 'Paris', 'Prague'])) // { b: ['Berlin'], p: ['Paris', 'Prague']}
The site doesn't like .reduce, but here's one way:
const r1 = groupIt(['hola', 'adios', 'chao', 'hemos', 'accion'])
console.log(r1)
// Should return
// {
// a: ["adios", "accion"]
// c: ["chao"]
// h: ["hola", "hemos"]
// }
function groupIt(arr) {
return arr.reduce((store, word) => {
const letter = word.charAt(0)
const keyStore = (
store[letter] || // Does it exist in the object?
(store[letter] = []) // If not, create it as an empty array
);
keyStore.push(word)
return store
}, {})
}
Case sensitive is the reason. Pop a toLowerCase in after the charAt(0).
Here's my example:
https://stackblitz.com/edit/node-tebpdp?file=ArrayStringsFirstLetter.js