Javascript 作为param传递的函数应使用同一调用中的另一个param
我正在js中重新创建过滤器、映射和查找函数。我有一个函数管道,它接受给定的数组,并通过一个函数数组传递它,比如filter,map等等 以下是我的职能:Javascript 作为param传递的函数应使用同一调用中的另一个param,javascript,arrays,ecmascript-6,Javascript,Arrays,Ecmascript 6,我正在js中重新创建过滤器、映射和查找函数。我有一个函数管道,它接受给定的数组,并通过一个函数数组传递它,比如filter,map等等 以下是我的职能: const filter = (arr, callback) => { let newArr = []; let j = 0; for (let i = 0; i < arr.length; i++) { if (callback(arr[i])) { newArr[j] = arr[i];
const filter = (arr, callback) => {
let newArr = [];
let j = 0;
for (let i = 0; i < arr.length; i++) {
if (callback(arr[i])) {
newArr[j] = arr[i];
j++;
}
}
return newArr;
};
const map = (arr, callback) => {
let newArr = [];
for (let i = 0; i < arr.length; i++) {
newArr[i] = callback(arr[i], i);
}
return newArr;
};
const pipe = (arr, callbacks) => {
console.log(arr, "arr");
console.log(callbacks, "callbacks");
};
但是,在使用管道时,我不应该将arr传递给每个函数。相反,过滤器和映射应该以某种方式从管道中获取arr。但是,由于这些函数是在管道调用中直接调用的,因此我不知道如何实现该功能
const arr = ['spray', 'limit', 'elite', 'exuberant', 'destruction']
pipe(
arr,
[
filter(item => item.length > 6), // returns ["exuberant", "destruction"]
map((item, index) => ({ id: index, name: item })) // returns [{ id: 0, name: 'exuberant' }, { id: 1, name: 'destruction' }]
]
)
// pipe returns [{ id: 0, name: 'exuberant' }, { id: 1, name: 'destruction' }]
通常过滤器和映射采用2个参数,arr和一个回调。但在管道中,只需要回调
任何帮助都将不胜感激。
谢谢。没有简单的解决方案,因为您可以在管道创建中直接调用函数过滤器和映射,然后将执行简单的函数 您可以做的一件事是更改过滤器和映射函数,以便它们返回一个带有方法的对象 常量过滤器=回调=>{ 函数执行arr={ 设newArr=[]; 设j=0; 对于let i=0;i
没有简单的解决方案,因为您可以在管道创建中直接调用函数过滤器和映射,然后将执行简单的函数 您可以做的一件事是更改过滤器和映射函数,以便它们返回一个带有方法的对象 常量过滤器=回调=>{ 函数执行arr={ 设newArr=[]; 设j=0; 对于let i=0;i
我看到您正在尝试实现一个称为pipe的函数式编程概念 有一个更好的方法来实现你想要实现的目标 不要将数组传递给管道函数,只将map和filter函数传递给管道函数,让管道函数返回另一个函数,该函数接受输入数组并返回从左到右执行每个函数的结果,并将输入数组传递给每个函数 还要更改map和filter函数,以返回另一个函数,该函数将输入数组作为参数,并在迭代数组并将每个元素传递给回调函数后返回新数组 常量过滤器=回调=>{ 返回arr=>{ 设newArr=[]; 设j=0; 对于let i=0;i
console.logresult 我看到您正在尝试实现一个称为pipe的函数式编程概念 有一个更好的方法来实现你想要实现的目标 不要将数组传递给管道函数,只将map和filter函数传递给管道函数,让管道函数返回另一个函数,该函数接受输入数组并返回从左到右执行每个函数的结果,并将输入数组传递给每个函数 还要更改map和filter函数,以返回另一个函数,该函数将输入数组作为参数,并在迭代数组并将每个元素传递给回调函数后返回新数组 常量过滤器=回调=>{ 返回arr=>{ 设newArr=[]; 设j=0; 对于let i=0;i
console.logresult;这里不是filteritem=>item.length>6,而是通过arr=>filterarr,item=>item.length>6,这是我的看法,使用前面提到的咖喱:是的,我在发布此处的问题之前就这样做了,但这不符合要求。使用管道时,我不应将arr传递给过滤器。无论如何,谢谢你。我使用了@gui3的解决方案,它起了作用。这很好,但你们知道,若你们使用这种方法,你们不能再像在你们的问题中那个样单独使用过滤器了,对吧?gui3比Yousaf的更差,而不是filteritem=>item.length>6,pass arr=>filterarr,item=>item.length>6使用前面提到的咖喱语,这是我的看法:是的,我在发布此处的问题之前做了,但这不符合要求。使用管道时,我不应将arr传递给过滤器。无论如何,谢谢你。我使用了@gui3的解决方案,它起了作用。这很好,但你们知道,若你们使用这种方法,你们不能再像在你们的问题中那个样单独使用过滤器了,对吧?正如我的评论所示,gui3比Yousaf更糟糕,只能使用咖喱。这样,您就不必实现整个执行构造,只需使用curry,就像我的注释所示。这样,您就不必实现整个execute构造。
const arr = ['spray', 'limit', 'elite', 'exuberant', 'destruction']
pipe(
arr,
[
filter(item => item.length > 6), // returns ["exuberant", "destruction"]
map((item, index) => ({ id: index, name: item })) // returns [{ id: 0, name: 'exuberant' }, { id: 1, name: 'destruction' }]
]
)
// pipe returns [{ id: 0, name: 'exuberant' }, { id: 1, name: 'destruction' }]