javascript - 作为参数传递的函数应该使用来自同一个调用的另一个参数
问题描述
我正在 js 中重新创建过滤器、映射、查找功能。我有一个函数pipe
,它接受给定的数组并将它传递给一个函数数组,例如过滤器、映射等。
这些是我的功能:
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");
};
我可以像这样使用过滤器,并且该功能工作正常。
const arr = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present']
filter(arr, item => item.length > 6) // returns ["exuberant", "destruction", "present"]
但是,在使用管道时,我不应该将 arr 传递给每个函数。相反, filter 和 map 应该以某种方式从管道中获取 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' }]
通常 filter 和 map 需要 2 个参数,arr
一个callback
. 但在管道中它只需要回调。
任何帮助,将不胜感激。谢谢。
解决方案
我看到您正在尝试实现一个称为pipe
.
有一种更好的方法可以实现您想要实现的目标。
而不是将数组传递给pipe
函数,只将map
andfilter
函数传递给pipe
函数并让pipe
函数返回另一个函数,该函数接受输入数组并返回从左到右执行每个函数并将输入数组传递给每个函数的结果。
还更改map
和filter
函数以返回另一个函数,该函数将输入数组作为参数,并在遍历数组并将每个元素传递给回调函数后返回一个新数组。
const filter = callback => {
return (arr) => {
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 = callback => {
return (arr) => {
const newArr = [];
for (let i = 0; i < arr.length; i++) {
newArr[i] = callback(arr[i], i);
}
return newArr;
};
};
const pipe = (...funcs) => {
return array => {
return funcs.reduce((acc, curr) => curr(acc), array);
};
};
const arr = ['spray', 'limit', 'elite', 'exuberant', 'destruction'];
const result = pipe(
filter(item => item.length > 6),
map((item, index) => ({ id: index, name: item }))
)(arr);
console.log(result);
推荐阅读
- macos - 如果在 macOS 上使用 `code .` 命令启动,Visual Studio Code 终端无法正常工作
- java - 有没有办法在 XMLHttpRequest 中将异步设置为 false
- json - JSON Schema 中的动态引用
- python - 使用 SQLITE 创建表并在输出不和谐时跳过条目
- vb.net - 避免datagridview vb.net中的重复数据
- git - 为什么需要输入提交信息?
- python - SpaCy DisplaCy 不检测自定义 IOB 标签
- python-3.x - 不和谐的嵌入式按钮
- html - 如何使用 CSS 在某些文本下方获得突出显示
- javascript - 开玩笑的 TouchEvent TypeError: $ 不是函数