# composeArgs
# Description
创建一个数组,该数组由部分应用的参数,占位符和提供的参数组成
# Params
(args, partials, holders, isCurried)
{Array} args - 提供的参数。
{Array} partials - 在提供的参数之前添加的参数。
{Array} holders - `partials' 占位符索引
{boolean} [isCurried] - 为curry过的函数指定合成。
# Return
Array
# Code
function composeArgs(args, partials, holders, isCurried) {
const argsLength = args.length
const holdersLength = holders.length
const leftLength = partials.length
let argsIndex = -1
let leftIndex = -1
let rangeLength = Math.max(argsLength - holdersLength, 0)
const result = new Array(leftLength + rangeLength)
const isUncurried = !isCurried
while (++leftIndex < leftLength) {
result[leftIndex] = partials[leftIndex]
}
while (++argsIndex < holdersLength) {
if (isUncurried || argsIndex < argsLength) {
result[holders[argsIndex]] = args[argsIndex]
}
}
while (rangeLength--) {
result[leftIndex++] = args[argsIndex++]
}
return result
}
# Analyze
- 首先
holders是占位的,传入的数组元素是索引值 rangeLength根据args的length和holders的length,算出差值,和 0 取较大的值- 紧接着
while循环,将partials的值 一一对应放到result中 - 接下来处理
holders,如果没有传入isCurried或者argsIndex < argsLength, 都会将holders中对应下标的索引值拿出来,当做result的索引,然后将当前索引的值设置为args中对应的值 - 处理
args的长度 大于holders的情况。如果符合条件,那么将最后多出来的元素,也补充进去。这里使用的是leftIndex,而不是argsIndex作为索引,是因为 第四步的时候,做的只是替换,而不是新增
# Example
console.log(composeArgs([1,2,3], [4,5,6,7,8,9], [4,5])) // [4, 5, 6, 7, 1, 2, 3]
console.log(composeArgs([1,2,3], [4,5,6,7,8,9], [0,1])) // [1, 2, 6, 7, 8, 9, 3]