gpt4 book ai didi

javascript - 获取函数式编程链中间的中间值

转载 作者:行者123 更新时间:2023-11-29 11:01:05 28 4
gpt4 key购买 nike

我想知道在 JavaScript 中是否有一种简洁或特定的方法来访问 FP 链中间的值。示例:

const somestuff = [true, true, false];
let filteredCount = 0;
somestuff.filter((val) => val)
.forEach((val) => console.log(val));

在上面,我想将 filteredCount 设置为 filter 函数返回的数组的长度。最直接的方法是:

const somestuff = [true, true, false];
const filteredStuff = somestuff.filter((val) => val);
let filteredCount = filteredStuff.length;
filteredStuff.forEach((val) => console.log(val));

这当然是有效的,但它打破了我们的 FP 链并引入了一个额外的持有变量。我想知道在链的中间是否有访问值的约定。像 .once() 这样的东西运行一次并隐式返回传入的值,但不存在这样的东西。

最佳答案

为了调试,我经常使用一个名为 tap 的函数来临时添加一个副作用 (比如你的 console.log)功能:

const tap = f => x => (f(x), x);

此函数返回传递给它的任何内容,但不会在使用该值调用另一个函数之前返回。例如:

const tap = f => x => (f(x), x);
const tapLog = tap(console.log);

const x = tapLog(10);

console.log("x is", x);

您的代码段基本上是这样做的:

  • 过滤列表
  • (记录列表)
  • 从数组中检索length 属性

如果您使用pipecompose 构造此函数,则可以在不中断数据流的情况下在两者之间“注入(inject)”console.log :

const countTrues = pipe(
filter(isTrue),
prop("length")
);

const countTruesWithLog = pipe(
filter(isTrue),
tap(console.log),
prop("length")
);

在一个片段中:

// Utils
const isTrue = x => x === true;
const prop = k => obj => obj[k];
const tap = f => x => (f(x), x);
const filter = f => xs => xs.filter(f);
const pipe = (...fns) => x => fns.reduce((res, f) => f(res), x);

// Logic:
// Filter an array using the isTrue function
// and return the length of the result
const countTrues = pipe(
filter(isTrue),
prop("length")
);

// Create a filter with a console.log side-effect
// and return the length of the result
const countTruesWithLog = pipe(
filter(isTrue),
tap(console.log),
prop("length")
);

// App:
const somestuff = [true, true, false];

console.log("pure:");
const countA = countTrues(somestuff)
console.log(countA);

console.log("with log:")
const countB = countTruesWithLog(somestuff);
console.log(countB);

关于javascript - 获取函数式编程链中间的中间值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46898733/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com