Jeff的隨手筆記

學習當一個前端工程師

0%

用LeetCode寫日記-Day6

今天狀況有點糟糕,居然一開始有點看不懂題目,昨天看NFL直撥看太晚了,比平常晚了1個半小時睡覺><”

Day6: Filter Elements from Array

Given an integer array arr and a filtering function fn, return a filtered array filteredArr.

The fn function takes one or two arguments:

  • arr[i] - number from the arr
  • i - index of arr[i]

filteredArr should only contain the elements from the arr for which the expression fn(arr[i], i) evaluates to a truthy value. A truthy value is a value where Boolean(value) returns true.

Please solve it without the built-in Array.filter method.

問題難度:Easy

問題限制:

  • 0 <= arr.length <= 1000
  • 109 <= arr[i] <= 109

我的解題思路

題目要求我們要回傳真值,先來確認一下這樣子回傳出來的是什麼:

1
2
3
4
5
6
7
8
var filter = function(arr, fn) {
let filteredArr = []
for (let i = 0; i < arr.length; i++) {
filteredArr.push(fn(arr[i], i))
}

return filteredArr
};

回傳 [0,0,1,1]。

OK,感覺沒錯跟我們想要出現的答案一樣,接下來就是加入if的判斷式:

1
2
3
4
5
6
7
8
9
10
var filter = function(arr, fn) {
let filteredArr = []
for (let i = 0; i < arr.length; i++) {
if (fn(arr[i], i)) {
filteredArr.push(arr[i])
}
}

return filteredArr
};

其他解法

使用forEach:

1
2
3
4
5
6
7
8
9
var filter = function(arr, fn) {
const result = [];
arr.forEach((value, index) => {
if (fn(value, index)) {
result.push(value);
}
});
return result;
};

使用Array.map and Array.reduce:

1
2
3
4
5
6
7
8
9
10
11
12
var filter = function(arr, fn) {
return arr.map((value, index) => {
if (fn(value, index)) {
return value;
}
}).reduce((result, value) => {
if (value !== undefined) {
result.push(value);
}
return result;
}, []);
};

結語

只要了解到什麼是真值(也就是除了:false0-00n(BigInt zero)'' (empty string)nullundefinedNaN以外的都是),就可以順利解出來。