JavaScript如何改造函数支持未知数量入参,动态修改返回函数的表达式
支持多属性参数的 trackByProp 函数实现
核心实现思路
你示例中写的外层forEach逻辑没有必要,因为返回的函数只有在实际调用时才会拿到value参数,提前操作无法关联到后续传入的value。
不需要动态修改返回函数的表达式,利用JS闭包特性,返回的内部函数可以直接访问外层传入的props参数数组,在内部遍历数组完成属性取值、运算即可。
完整实现代码
function trackByProp(...props) { return function (value) { // 场景1:将所有属性值拼接为字符串(对应你示例中的+拼接需求) return props.map(prop => value[prop]).join(''); // 场景2:属性值为数值,需要返回累加和 // return props.reduce((total, prop) => total + (value[prop] ?? 0), 0); // 场景3:返回所有属性值组成的数组 // return props.map(prop => value[prop]); }; }
更简洁的写法
用箭头函数可以进一步简化代码,以拼接字符串的场景为例,还可以额外增加可选链、空值合并逻辑,避免属性不存在时报错:
const trackByProp = (...props) => value => props.map(p => value?.[p] ?? '').join('');
使用示例
// 传入需要拼接的两个属性 const trackByIdAndName = trackByProp('id', 'name'); // 调用返回的函数取值 console.log(trackByIdAndName({id: 101, name: '测试'})); // 输出:101测试
内容的提问来源于stack exchange,提问作者Nicholas Foden
相关产品推荐
相关产品推荐

