Skip to content

Commit 38a079a

Browse files
authored
Add write-up for LeetCode problem 2634. Filter Elements from Array (#409)
1 parent 9967f2a commit 38a079a

File tree

15 files changed

+322
-78
lines changed

15 files changed

+322
-78
lines changed

workspaces/javascript-leetcode-month/problems/2634-filter-elements-from-array/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
[View Problem on LeetCode](https://leetcode.com/problems/filter-elements-from-array/)
44

5-
This is one of many problems that essentially ask us to implement some built-in JavaScript function. Here, we're asked to implement filtering without using [`.filter`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter), so of course the first thing we should do is get accepted using `.filter`!
5+
This is one of several problems that essentially ask us to implement some built-in JavaScript function. Here, we're asked to implement filtering without using [`.filter`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter), so of course the first thing we should do is get accepted using `.filter`!
66

77
For a more serious solution, a loop that builds the result works just fine.
88

workspaces/javascript-leetcode-month/problems/2634-filter-elements-from-array/solution.md

Lines changed: 185 additions & 77 deletions
Large diffs are not rendered by default.
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
function filter<T>(
2+
arr: readonly T[],
3+
fn: (element: T, index: number) => unknown,
4+
): T[] {
5+
const res: T[] = [];
6+
7+
for (let i = 0; i < arr.length; ++i) {
8+
const element = arr[i];
9+
fn(element, i) && res.push(element);
10+
}
11+
12+
return res;
13+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
function filter<T>(
2+
arr: readonly T[],
3+
fn: (element: T, index: number) => unknown,
4+
): T[] {
5+
const res: T[] = [];
6+
7+
arr.forEach((element, index) => {
8+
fn(element, index) && res.push(element);
9+
});
10+
11+
return res;
12+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
function filter<T>(
2+
arr: readonly T[],
3+
fn: (element: T, index: number) => unknown,
4+
): T[] {
5+
const res: T[] = [];
6+
7+
for (const [index, element] of arr.entries()) {
8+
fn(element, index) && res.push(element);
9+
}
10+
11+
return res;
12+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
function* lazyFilter<T>(
2+
arr: readonly T[],
3+
fn: (element: T, index: number) => unknown,
4+
): Generator<T, void, void> {
5+
for (const [index, element] of arr.entries()) {
6+
fn(element, index) && (yield element);
7+
}
8+
}
9+
10+
const filter = <T>(
11+
arr: readonly T[],
12+
fn: (element: T, index: number) => unknown,
13+
): T[] => Array.from(lazyFilter(arr, fn));
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
function filter<T>(
2+
arr: readonly T[],
3+
fn: (element: T, index: number) => unknown,
4+
): T[] {
5+
const res: T[] = [];
6+
7+
const doFilter = (index: number) => {
8+
if (index === arr.length) {
9+
return;
10+
}
11+
12+
const element = arr[index];
13+
fn(element, index) && res.push(element);
14+
doFilter(index + 1);
15+
};
16+
17+
doFilter(0);
18+
19+
return res;
20+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
function filter<T>(
2+
arr: readonly T[],
3+
fn: (element: T, index: number) => unknown,
4+
index: number = 0,
5+
res: T[] = [],
6+
): T[] {
7+
if (index === arr.length) {
8+
return res;
9+
}
10+
11+
const element = arr[index];
12+
fn(element, index) && res.push(element);
13+
return filter(arr, fn, index + 1, res);
14+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
/**
2+
* @param {number[]} arr
3+
* @param {Function} fn
4+
* @return {number[]}
5+
*/
6+
const filter = Function.prototype.call.bind(Array.prototype.filter);
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
const filter = <T>(
2+
arr: readonly T[],
3+
fn: (element: T, index: number) => unknown,
4+
): T[] => arr.filter(fn);

0 commit comments

Comments
 (0)