/**
* @param {Function} fn
* @param {Array} args
* @return {Function}
*/
var partial = function(fn, args) {
return function(...restArgs) {
}
};
2797. 带有占位符的部分函数
给定函数 fn
和数组 args
,返回一个函数 partialFn
。
args
中的占位符 "_"
需要用 restArgs
中索引从 0
开始的值替换。 restArgs
中剩余的值则添加到 args
的末尾。
partialFn
应该返回 fn
的结果。fn
应该使用修改后的 args
的元素作为单独的参数调用。
示例 1:
输入:fn = (...args) => args, args = [2,4,6], restArgs = [8,10] 输出:[2,4,6,8,10] 解释: const partialFn = partial(fn, args) const result = partialFn(...restArgs) console.log(result) // [2,4,6,8,10] args 中没有占位符 "_",因此 restArgs 只是添加到 args 的末尾。然后将 args 的元素作为单独的参数传递给 fn,fn 返回传递的参数作为数组。示例 2:
输入:fn = (...args) => args, args = [1,2,"_",4,"_",6], restArgs = [3,5] 输出:[1,2,3,4,5,6] 解释: const partialFn = partial(fn, args) const result = partialFn(...restArgs) console.log(result) // [1,2,3,4,5,6] 占位符 "_" 被 restArgs 中的值替换。然后将 args 的元素作为单独的参数传递给 fn,fn 返回传递的参数作为数组。
示例 3:
输入:fn = (a, b, c) => b + a - c, args = ["_", 5], restArgs = [5, 20] 输出:-10 解释: const partialFn = partial(fn, args) const result = partialFn(...restArgs) console.log(result) // -10 占位符 "_" 被替换为 5,并将 20 添加到 args 的末尾。然后将 args 的元素作为单独的参数传递给 fn,fn 返回 -10(5 + 5 - 20)。
提示:
fn
是一个函数args
和 restArgs
都是有效的 JSON 数组1 <= args.length <= 5 * 104
1 <= restArgs.length <= 5 * 104
0 <= number of placeholders <= restArgs.length
原站题解
typescript 解法, 执行用时: 68 ms, 内存消耗: 47.8 MB, 提交时间: 2023-10-15 13:31:01
type JSONValue = null | boolean | number | string | JSONValue[] | { [key: string]: JSONValue }; type Fn = (...args: JSONValue[]) => JSONValue function partial(fn: Function, args: any[]): Function { return function (...restArgs) { let i = 0 const argsRep = args.map(item => item !== '_' ? item : restArgs[i++]) return fn(...argsRep.concat(restArgs.slice(i))) } }; function partial2(fn: Function, args: any[]): Function { return function (...restArgs) { return fn(...args.map(arg => arg === '_' ? restArgs.shift() : arg).concat(restArgs)) } };
javascript 解法, 执行用时: 2392 ms, 内存消耗: 46.9 MB, 提交时间: 2023-10-15 13:30:30
/** * @param {Function} fn * @param {Array} args * @return {Function} */ var partial = function(fn, args) { return function(...restArgs) { let replaceIndex while((replaceIndex = args.indexOf('_')) >= 0) args.splice(replaceIndex, 1, restArgs.shift()) return fn.apply(this, [...args, ...restArgs]) } }; var partial2 = function(fn, args) { function concatArgs(array1,array2){ let result = []; let array2Index = 0; args.forEach(item => { if (item!=='_'){ result.push(item); } else { result.push(array2[array2Index++]); } }) return result.concat(array2.slice(array2Index)); } return function(...restArgs) { const newArgs = concatArgs(args,restArgs); return fn(...newArgs); } };