Articles of 函数式编程

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

我想知道是否有可能改变传递给一个函数的对象的属性,而不会改变对象的状态。 像这样的东西: 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,我通常会绕过一个学校的实例。 这是正确的想法,是否有其他方法?

如何使用node.lift-ed函数when.map?

我正在学习使用when.js库的承诺,并使用带有节点fs.readFile让我觉得我错过了一些东西。 当作为一个单独的promise被调用时, foo promise可以正常工作,但是在when.map作为映射器函数使用时会失败,因为index被注入为第三个参数(然后callback被传递为第四个参数)。 API doc说when.map对mapper函数有两个参数要求。 然后,mapper函数可以写成bar ,它可以在任何情况下工作。 var when = require('when'); var node = require('when/node'); var _ = require('lodash'); // readFile has the same signature as fs.loadFile function readFile(param1, param2, callback) { console.log(Array.prototype.slice.call(arguments)); callback(null, [param1, param2]); } var foo = _.partialRight(node.lift(readFile), 'base64'); var bar = function (fileName, index) { return node.lift(readFile)(fileName, 'base64'); }; when.map(['1', […]

有这个function的标准function名称?

我确定这个函数可能是普遍的(或者可能可以通过其他方式实现),但是我不确定它会被调用什么。 我正在考虑一个特定大小的滑动窗口: let slidingMap = (arr,size, f) => { r = [] arr.reduce((acc, n) => { let b = acc.concat(n); if(b.length > size) { b.shift(); } if(b.length == size) { r.push(f(b)) } return b; },[]) return r; } 所以给出slidingMap([1,2,3,4,5,6], 2, b => b) 你会得到[ [ 1, 2 ], [ 2, 3 ], [ 3, 4 […]

从asynchronous方法返回数据的服务

我正在使用Sails的ORM(水线)。 我已经写了一个geturl服务,应该返回我的应用程序中的几个模型/动作的url。 我目前在我的模板中调用这个服务。 (正如我独自开发这个,如果这种devise模式是错误的,请不要犹豫提醒我) 现在Waterline的.find()方法是asynchronous的(它应该)。 在数据库中插入或提取事物时,我总是使用callback函数来执行操作。 现在我已经看到无处不在 ,我不能从asynchronous方法返回任何数据。 因此我感到困惑,因为我想创build这个[该死的]服务来集中URLpipe理。 这是我现在的代码: module.exports = { variete: function(id_objet) { var string = '/default_url'; return onvariete(id_objet, function (err, url) { if (err) { sails.log.error('Error : ', err); } else { return url; } }); } }; function onvariete(id_objet, next) { var url = '/'; return Variete.findOne({id:id_objet}).exec(function (err, v) { […]

下划线组sorting

我有一个关于函数式编程的问题。 我使用underscore.js库。 让我们考虑一些用例。 我有一些重复标签的数组,我需要计算每个标签在数组中的出现次数,并根据出现次数进行sorting。 为了计算,我可以使用countBy多less个标签 _.countBy([1, 2, 3, 4, 5], function(num) { return num % 2 == 0 ? 'even': 'odd'; }); => {odd: 3, even: 2} 但在这里,因为我有一个散列,这对订单没有意义,所以没有sorting。 所以在这里,我需要将散列转换为数组然后对其进行sorting并将其转换为散列。 我很确定有这样一个优雅的方式,但我没有意识到这一点。 我将不胜感激任何帮助。

如何添加字段的JavaScript数组中的每个对象没有循环?

有没有方法来添加一个字段的每个对象的Javascript数组没有循环呢? 就像是 array.each(function (index, object){ object[newField] = anotherArray[index]; });