Articles of 函数式编程

从一系列可能的path中获取string

我有一个场景,我需要抓住一个对象的string的第一个匹配项,但只有匹配发生在一个已经预先定义的path中。 { id: 'I60ODI', description: 'some random description' } { foo: 'bar', description: { color: 'green', text: 'some description within text' } } 当提供上述两个对象中的任何一个时,我希望解决scheme返回some random description或some description within text ,只要两个可能的path是obj.description和obj.description.text 。 未来可能还需要添加新的path,所以添加它们需要很容易。 这是迄今为止我已经实施的解决scheme,但对我来说,这似乎并不是最佳的。 // require the ramda library const R = require('ramda'); // is the provided value a string? const isString = R.ifElse(R.compose(R.equals('string'), (val) => […]

有没有办法在内部写一个Maybe.map的承诺?

我正在关注这篇优秀文章的前半部分,但是有一个地方我被困住了。 https://jrsinclair.com/articles/2016/marvellously-mysterious-javascript-maybe-monad/ 我已经实现了一个非常相似的Maybe monad,但是我需要传递给map的一个函数是asynchronous的。 理想情况下,我可以在.then()和map()的组合中做到这一点。 我想要做这样的事情… const getToken = async (p) => { let result = utils.Maybe.of(await makeAICCCall(p.aiccsid, p.aiccurl)) .map(parseAuthenticatedUser) .thenMap(syncUserWithCore) <– I can't figure this out .map(managejwt.maketoken) .value return result; } 我已经尝试过所有我能想到的事情,但是我一直无法弄清楚这一点。

通过键下划线聚集哈希

我在机器学习应用程序上工作。 当我需要使用数组和哈希运算时,我使用underscorejs。 问题在于,ML中有一个交叉validation的方法,当你需要计算性能的几倍。 对于每一个折叠,我有一个哈希的性能参数,如下所示 { 'F1': 0.8, 'Precision': 0.7, 'Recall':0.9 } 我把所有的哈希都推送到数组中,最后我有一组哈希,就像下面这样 [ { 'F1': 0.8, 'Precision': 0.7, 'Recall':0.9 }, { 'F1': 0.5, 'Precision': 0.6, 'Recall':0.4 }, { 'F1': 0.4, 'Precision': 0.3, 'Recall':0.4 } ] 问题是,最后我想计算散列的每个参数的平均值,即我想根据参数对所有散列进行总结,然后将每个参数除以折叠的数量,在我的情况3中。 如果有任何优雅的方式来做下划线和JavaScript? 一个重要的一点是有时候我需要做这个聚合,当这样的哈希像下面这样折叠 { label1:{ 'F1': 0.8, 'Precision': 0.7, 'Recall':0.9 }, label2:{ 'F1': 0.8, 'Precision': 0.7, 'Recall':0.9 }, … } […]

如何从头开始在Javascript中编写asynchronousMap函数?

我需要从头开始写这个asyncMap函数的帮助。 我想我已经差不多了,但我不确定为什么我一直得到错误的答案。 这是我迄今为止的代码: function wait3For1(callback){ setTimeout(function(){ callback('one') }, 300) } function wait2For5(callback){ setTimeout(function(){ callback('five') }, 200) } function asyncMap(tasks, callback){ return callback( tasks.map((item) => item((element) => element))) } asyncMap([wait3For1, wait2For5], function(arr){ console.log(arr) //expect ['one', 'five'] }); 我一直越来越[undefined, undefined]我敢肯定,这是因为我没有正确执行callbackwait2For5和wait3For1,但不知道是什么问题。 提前致谢!

模拟本地存储以testing两种方法的function/覆盖

以下代码使用本地存储工作正常,我想为它创buildunit testing的问题是,我在这个函数中使用本地存储 这是我想testing的function open: function(url) { var that = this; if (!localStorage.getItem(“alert”)) { that_run(url) .then(function(isBlocked) { if (isBlocked) { that._notify(); localStorage.setItem(“alert”, true); } else { localStorage.setItem(“alert”, true); that._exe(“page”,url) } }).done(); } else { that._exe(“page”,url) } }, 这是正在工作的testing,但我认为重写窗口是不好的做法和我的问题,如果我能写这个testing更好? it.only("test for open", function () { var url = "http://mytesturl”; winlocalStorage.getItem = function(){ return false; }; var oSimulateSpy […]

如何操作传递给函数的对象的属性而不改变状态

我想知道是否有可能改变传递给一个函数的对象的属性,而不会改变对象的状态。 像这样的东西: function startOfLine(options) { options.someProp = += 'startOfLine'; return options; } function otherFunction(options) { // do something with options and… return options; } const options = startOfLine(otherFunction({ somePro: '', someProp2: '' })); 我将以dynamic方式创build函数的执行,这就是为什么我不担心嵌套20个级别的调用。 谢谢。

如何处理返回一个内部callbackvariables?

如何在callback中访问variables,而不必先将其重新分配给variables? 例如,下面的代码工作: let volume = 0; loudness.getVolume((err, vol) => { volume = vol; }); 但是,如果我希望它可以直接分配给一个const 。 以下返回未定义: const volume = loudness.getVolume((err, vol) => vol));

比较2个数组并find与Ramda相同的值

我最近爱上了函数式编程,并开始学习ramda.js,但我似乎还没有进入function思维。 我有2个string数组(他们实际上是拆分string),我想find第一个string中有多less个字符等于在第二个string中的相同位置。 我必须做一些非常简单的事情: let counter = 0 for(let i = 0; i < array.length; i++){ if(firstArray[i] === secondArray[i]) counter++ } 但我将如何使用ramda呢?

映射整个对象数组,而不会影响所有对象字段

我有一个对象的数组,我需要以某种方式parsing。 这些对象具有一组通用字段和一些不存在于所有对象中的可选字段。 为了这个例子, a,b,c是常见的字段, d,e,f是可选的。 我想对某些领域进行一些操作,例如将a和d的值加倍,而把剩下的部分保持原样。 如果某个对象缺less一个或多个可选字段,则应该保留在结果中。 问题是,我想以一种纯粹的function性的方式来做,而不是宣布一个空的数组,并推入它。 示例input: const input = [ { a: 3, b: 'test', c: 34, d: 'example' }, { a: 6, b: 'another', c: 0, e: true, f: () => {} } ]; 预期结果: [ { a: 6, b: 'test', c: 34, d: 'EXAMPLE' }, { a: 12, b: 'another', […]

什么是在Node.js中表示状态的普遍接受模式

例如,在经典的面向对象的编程中,我可能有一个class级学校有一个代表学生的string数组(不是理想的数据结构,但仅用于说明目的)。 它可能看起来像这样 class School { String name; String[] students; } 然后,我可以实例化一堆不同名称,不同学校的学校。 这个概念如何转化为Node.js? 如果我有一个学校模块,而不是单个实例在整个应用程序中共享。 我最初的想法是把每个学校都当作JSON对象,基本上绕过JSON,我通常会绕过一个学校的实例。 这是正确的想法,是否有其他方法?