开玩笑地抛出TyperError:使用lodash管道/流程时需要一个函数

时间:2019-05-27 10:36:00

标签: javascript reactjs jestjs lodash

我有以下代码:

function sort() {
   let array1 = [{ value:1 }, { value:2 }, { value:3 }];
   let array2 = [{ code:1 }, { code:2 }, { code:3 }];
   const constructSortedArray = pipe(
     sortBy(array1, element => element.value),
     sortedArray1 => sortedArray1.concat(array2)
   );
   return constructSortedArray();
 }

我使用lodash/fp/flow作为管道别名和lodash/sortBy。在运行代码时,该功能可以正常工作,但在开玩笑地测试代码时,我在pipe上收到以下错误:

TypeError: Expected a function 

> 73 |     const constructSortedArray = pipe(

我尝试将testEnviornment设置为jsdomnode,但这没有帮助。 automock也出于玩笑而被禁用。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

调用sortBy时,它返回结果,而不是函数。您可以通过使用箭头函数并以array1作为参数调用管道函数来进行修复。

注意:lodash没有_.pipe()方法(它名为_.flow()),但是lodash / fp有(这是_.flow()的别名)。

const { flow, sortBy } = _;

function sort() {
  let array1 = [{ value:1 }, { value:2 }, { value:3 }];
  let array2 = [{ code:1 }, { code:2 }, { code:3 }];
  const constructSortedArray = flow(
    arr => sortBy(arr, element => element.value),
    sortedArray1 => sortedArray1.concat(array2)
  );
  return constructSortedArray(array1);
}
 
console.log(sort());
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

更干净的选择是让用户_.partialRight()返回一个已经应用了最正确参数的函数:

const { flow, partialRight, sortBy, concat } = _;

function sort() {
  let array1 = [{ value:1 }, { value:2 }, { value:3 }];
  let array2 = [{ code:1 }, { code:2 }, { code:3 }];
  
  const constructSortedArray = flow(
    partialRight(sortBy, element => element.value),
    partialRight(concat, array2)
  );

  return constructSortedArray(array1);
}

console.log(sort());
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

最干净的方法是使用lodash / fp用户,因为所有函数都是自动运行的,并且参数的顺序正确:

const { pipe, partialRight, sortBy, concat } = _;

function sort() {
  let array1 = [{ value:1 }, { value:2 }, { value:3 }];
  let array2 = [{ code:1 }, { code:2 }, { code:3 }];
  
  const constructSortedArray = pipe(
    sortBy(element => element.value),
    partialRight(concat, [array2])
  );

  return constructSortedArray(array1);
}

console.log(sort());
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>