Intro 🌐
Problem solving is an important skill, for your career and your life in general.
That's why I take interesting katas of all levels, customize them and explain how to solve them.
Today's exercise
Today, another 7 kyu
kata,
meaning we slightly increase the difficulty.
Source: Codewars
Write a function filterHomogenous
, that accepts one parameter: myArrays
.
Given an array of arrays, e.g. [[1, 5, 4], ['a', 3, 5], ['b'], [], ['1', 2, 3]]
,
return a new array which carries over only those arrays from the original which are not empty and whose items are all of the same type,
e.g. [[1, 5, 4], ['b']]
.
Implicit type casting is not allowed, e.g. [1, '2']
would be considered illegal and should be filtered out.
Input: an array of arrays.
Output: an array of arrays.
Thinking about the Solution 💭
First, we need to understand the exercise! If we don't understand it, we can't solve it!.
I think I understand the exercise (= what I put into the function and what I want to get out of it).
Now, I need the specific steps to get from input to output.
I try to do this in small baby steps:
- Find out if a specific array is not empty
- Find out if all elements of a specific array have the same type
- Filter the input array for all arrays that pass both
Example:
- Input:
[[1, 5, 4], ['a', 3, 5], ['b'], [], ['1', 2, 3]]
- Find out if array is not empty & if all elements have the same type:
[1, 5, 4]
=> not empty:true
, same type:true
=> add to result array:true
- Find out if array is not empty & if all elements have the same type:
['a', 3, 5]
=> not empty:true
, same type:false
=> add to result array:false
- Find out if array is not empty & if all elements have the same type:
['b']
=> not empty:true
, same type:true
=> add to result array:true
- Find out if array is not empty & if all elements have the same type:
[]
=> not empty:false
, same type:true
=> add to result array:false
- Find out if array is not empty & if all elements have the same type:
['1', 2, 3]
=> not empty:true
, same type:false
=> add to result array:false
- Filter the input array for all arrays that pass both:
[[1, 5, 4], ['b']]
- Output:
[[1, 5, 4], ['b']]
✅
Implementation ⛑
function filterHomogenous(myArrays) {
const isHomogenous = (array) =>
array.every((el, i, arr) => typeof el === typeof arr[0]);
return myArrays.filter((array) => array.length && isHomogenous(array));
}
Result
console.log([[1, 5, 4], ["a", 3, 5], ["b"], [], ["1", 2, 3]]);
// [[1, 5, 4], ['b']] ✅
console.log([[123, 234, 432], ["", "abc"], [""], ["", 1], ["", "1"], []]);
// [[123, 234, 432], ['', 'abc'], [''], ['', '1']] ✅
Playground ⚽
You can play around with the code here
Next Part ➡️
Great work!
We learned how to use every
and filter
.
I hope you can use your new learnings to solve problems more easily!
Next time, we'll solve another interesting kata. Stay tuned!
If I should solve a specific kata, shoot me a message here.
If you want to read my latest stuff, get in touch with me!
Further Reading 📖
Questions ❔
- How often do you do katas?
- Which implementation do you like more? Why?
- Any alternative solution?