文章

前端面試手寫練習 - partial

文章發表於

問題

partial 是將函式 庫里化 (Currying) 的一種方式,它可以接受一個函式和部分參數,並返回一個新的函式,這個新的函式將會接受剩餘的參數。當所有參數都被提供時,將會執行原始函式。

function partial(func: Function, ...args: any[]): Function

範例

在開發中,時常會將資料處理的邏輯抽象化成一個通用函式,目的是讓該功能可以更方便地被重複使用。

舉例來說,很多情況下我們在實作功能前已經知道了 API 的端點,但是 id 是動態的,所以可能會將函式根據業務邏輯進行拆分:

// api.js
const getPostById = (id) => fetch(`https://jsonplaceholder.typicode.com/posts/${id}`)
const getUserById = (id) => fetch(`https://jsonplaceholder.typicode.com/users/${id}`)
// app.js
const btn = document.querySelector('btn')
btn.addEventListenr('click', async (evt) => {
const { value } = evt.target
const post = await getPostById(value)
})

這樣的寫法沒有問題,但是如果有接觸過一些函數式編程的話,可能會發現這樣的寫法有點冗長,這時候就可以使用 partial 來簡化:

// api.js
const fetchById = (url, id) => fetch(url, id)
const getPostById = partial(fetchById, 'https://jsonplaceholder.typicode.com/posts')
const getUserById = partial(fetchById, 'https://jsonplaceholder.typicode.com/users')

練習區

在了解問題後,可以嘗試先寫下您的思路,再到下方的練習區域實際寫出程式碼。

import { add } from './add';

describe('add', () => {
  test('Commutative Law of Addition', () => {
    expect(add(1, 2)).toBe(add(2, 1));
  });
});

Open browser consoleTests

追問

  1. 支援 placeholderpartial 函式。
const _ = partial.placeholder
const subtract = (a, b) => a - b
const subtractFrom10 = partial(subtract, _, 10)
subtractFrom10(5) // -5

筆者解答

function partial(func, ...args) {
return function partiallyApplied(...restArgs) {
return func.call(this, ...args, ...restArgs);
};
}

相關題目

  1. bigfrontend.dev - partial
如果您喜歡這篇文章,請點擊下方按鈕分享給更多人,這將是對筆者創作的最大支持和鼓勵。