Javascript 以功能性、协变的方式使用Array.prototype.map
假设我有以下输入(用于Javascript 以功能性、协变的方式使用Array.prototype.map,javascript,node.js,ecmascript-6,prototype-programming,array.prototype.map,Javascript,Node.js,Ecmascript 6,Prototype Programming,Array.prototype.map,假设我有以下输入(用于节点,但问题更一般,与节点无关): 目录的绝对路径,称之为dirPathAbs 存在于该文件夹中的一些JS文件的基名数组(称为nameseq) 例如: 我可能有nameseq=['a','b','c'],它对应于a.js,b.js,c.js内部dirPathAbs 问题: 如何以纯粹的功能方式,但也以协变方式,解析文件路径?(也就是说,不必谈论迭代数组的变量。协变可能不是这个词,抱歉) 我不想要的是: 也不是 也不是 也不是 我希望这个能起作用 但事实并非如此。我认为p
节点
,但问题更一般,与节点无关):
- 目录的绝对路径,称之为
dirPathAbs
- 存在于该文件夹中的一些JS文件的基名数组(称为
)nameseq
nameseq=['a','b','c']
,它对应于a.js
,b.js
,c.js
内部dirPathAbs
问题:
如何以纯粹的功能方式,但也以协变方式,解析文件路径?(也就是说,不必谈论迭代数组的变量。协变可能不是这个词,抱歉)
我不想要的是:
也不是
也不是
也不是
我希望这个能起作用
但事实并非如此。我认为path.resolve.bind(dirPathAbs)
作为输入nameseq
,这是提供给Array.prototype.map
的回调的第三个参数,因为我看到的错误是
TypeError: Path must be a string. Received [ 'a', 'b', 'c' ]
这只是让我感到沮丧的一种练习,但自从学习JS以来,一整套类似的练习让我头疼。当代码< > < <代码>绑定时,我仍然缺少一些东西,以及所有这些<代码>函数。原型< <代码> >代码>数组。原型< <代码>和朋友应该被使用。 < p>你可以在中间添加另一个函数来填充这些额外的变量:
const take = (fn, n) => (...args) => fn(...args.slice(0, n));
const bind = fn => (...args) => (...args2) => fn(...args, ...args2);
namesSeq.map(take(bind(path.resolve)(dirPathAbs), 1));
但是我没有看到命名参数上的任何advatange。您没有注意到Array.map
所期望的回调
阅读后,您会发现这是该方法的语法:
var new_array = arr.map(function callback(currentValue[, index[, array]]) {
// Return element for new_array
}[, thisArg])
如您所见,它将把整个数组传递给回调函数。这就是您想要的解决方案不起作用的原因
不寻求外部库(如)帮助的最佳解决方案是您的倒数第二个选项:
namesSeq.map(base => path.resolve.bind(dirPathAbs)(base));
我认为关于
namesq
的一个假设在这里可能有部分错误。这里有一个非常简单的例子,或多或少地遵循您所做的。运行代码段时,您可以看到它按预期工作:
函数模拟解析(输入){
console.log(输入)
返回输入*2;
}
var scopeObject={
顺序:[1,2,3]
};
var accessSequence=scopeObject.sequence;
var-mapping=accessSequence.map(mockResolve.bind(scopeObject));
console.log(映射)你为什么不想要这些解决方案中的任何一个呢?快速的回答是“为了练习”,但我还有另一个原因。我会在几个小时内把它弄清楚。
namesSeq.map(path.resolve.bind(dirPathAbs))
TypeError: Path must be a string. Received [ 'a', 'b', 'c' ]
const take = (fn, n) => (...args) => fn(...args.slice(0, n));
const bind = fn => (...args) => (...args2) => fn(...args, ...args2);
namesSeq.map(take(bind(path.resolve)(dirPathAbs), 1));
var new_array = arr.map(function callback(currentValue[, index[, array]]) {
// Return element for new_array
}[, thisArg])
namesSeq.map(base => path.resolve.bind(dirPathAbs)(base));