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