Skip to content

Instantly share code, notes, and snippets.

@AlanJereb
Last active August 23, 2023 07:19
Show Gist options
  • Save AlanJereb/2695958c85284054998e7ba4d29bb941 to your computer and use it in GitHub Desktop.
Save AlanJereb/2695958c85284054998e7ba4d29bb941 to your computer and use it in GitHub Desktop.
ForEach, Filter and Map implemented using Reduce [typesafe]
const testArray = [1, 2, 3];
// ----
// MAP
// ----
const customMap = <T extends unknown>(arr: T[], callback: (value: T) => T) => {
return arr.reduce((mapped: T[], current) => {
mapped.push(callback(current))
return mapped
}, [])
}
// test
console.log(customMap(testArray, (val) => val * 2));
// ----
// FILTER
// ----
const customFilter = <T extends unknown>(arr: T[], callback: (value: T) => boolean) => {
return arr.reduce((filtered: T[], current) => {
if (callback(current)) {
filtered.push(current);
}
return filtered;
}, [])
}
// test
console.log(customFilter(testArray, (val) => val === 2));
// ----
// FOREACH
// ----
const customForEach = <T extends unknown>(arr: T[], callback: (value: T) => void) => {
return arr.reduce((_, current) => {
callback(current);
return _;
}, null)
}
// test
customForEach(testArray, (val) => console.log("This is: " + val));
// ----
You can test the outputs here: https://www.typescriptlang.org/play?ssl=38&ssc=1&pln=1&pc=1#code/MYewdgzgLgBFCm0CCAnFBDAnjAvDA2gIwA0MATKQMwC6A3AFAD0jMAtO60ywLJIAKXNh3qhIsYAFdoIALbd0AB1wwAPABUY8AB4IwAEwgwJYANZgQAdzAA+ABTo0ALhhr81UsHQAbLwCN0wCbOtgBu3hLwzmoAlLjWLrE48QDe9DAwKPBQEihgMA4oAHSZehLA8La2MooK8HpRbh45mWBQiSlp6TDVCrV6hQpSABa2nj7+gaPN8K3R0Z3pmdm53TV1nQC+pG7zG4II0CLgECBe8IVeIADmU9JyirYHUKgYmKSh3u0wYV4wAFTkOYMZhCdiCABiAEkADJqACiACVBBxOKJoDBJHdwQBLLwIFDKdSaHQzAxGUzmKx2AoNdwY7x+AJBGAfLwRKJfXwgU7wdBgL6pRZZHJ5ArFOplCq2ABmuPxdVpTTQMzacRggq62OlLLGjMmkmVs1iGq6MFlePgJQGwymhraDFNe1NSxFZrllrqDpgWwI1F2+0QUCOkB5F2utygshxFpQj0DLyw7x+Xx+uBweDIQORwhB4IA8gi4UgAMIACWzYLR4ikkZk4JAKDhASGhI02l0ZOMZksNnsThcjXp4yZwR+7ISapCIGxegFnRdKzFJUllQA+kqWqqkuqFkO9SZbZvol6hcs8quvT6wBIfP6QU8RDWow2m8ARk8E28Wcm1WjQ5cbgAIjUIZsUMMDnEAmAAGpvk+Y8K04IA
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment