列表

详情


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)。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
/** * @param {Function} fn * @param {Array} args * @return {Function} */ var partial = function(fn, args) { return function(...restArgs) { } };

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);
    }
};

上一题