首页 > 解决方案 > 作为参数传递的函数应该使用来自同一个调用的另一个参数

问题描述

我正在 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. 但在管道中它只需要回调。

任何帮助,将不胜感激。谢谢。

标签: javascriptarraysecmascript-6

解决方案


我看到您正在尝试实现一个称为pipe.

有一种更好的方法可以实现您想要实现的目标。

而不是将数组传递给pipe函数,只将mapandfilter函数传递给pipe函数并让pipe函数返回另一个函数,该函数接受输入数组并返回从左到右执行每个函数并将输入数组传递给每个函数的结果。

还更改mapfilter函数以返回另一个函数,该函数将输入数组作为参数,并在遍历数组并将每个元素传递给回调函数后返回一个新数组。

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


推荐阅读