JavaScript中的功能循环与非功能循环

时间:2019-05-16 18:59:07

标签: javascript functional-programming

我想做的是返回一个基于动态大小的对象数组,我觉得我可能会以一种过于复杂的方式来执行此操作,但是这些天我也在尝试以一种更具功能性的方式来执行操作。 / p>

这是我如何以非功能性方式进行操作

function nonFunctional(size) {
  let foo = [];

  for (let index = 0; index < size; index++) {
    foo.push({ bar: "baz" });
  }

  return foo;
}

这就是我试图以功能性方式实现的方式

function functional(size) {
  return [...new Array(size)].map(() => {
    return {
      bar: 'baz'
    }
  });
}
  1. 这是从功能上做到这一点的最佳方法吗?
  2. 与“传统”方式相比,这种方式有什么优点/缺点?
  3. 这真的与功能编程有关吗?

2 个答案:

答案 0 :(得分:2)

通过识别此行为应独立于自己的功能,您可以从头开始。但是“功能性”不限于常见的方法,例如mapreducefilter

请考虑以下buildArray-

const identity = x =>
  x
  
const buildArray = (size = 0, f = identity) =>
  size === 0
    ? []
    : [ ...buildArray(size - 1, f), f(size - 1) ]
    
console.log(buildArray(5))
// [ 0, 1, 2, 3, 4 ]

console.log(buildArray(5, x => x * x))
// [ 0, 1, 2, 3, 16 ]

console.log(buildArray(3, () => ({ a: 1 })))
// [ { a: 1 }, { a: 1 }, { a: 1 } ]

console.log(buildArray())
// []

答案 1 :(得分:0)

  1. 我愿意(不一定更好):

      return Array.from({ length: size }, () => ({ bar: "baz" }));
    
  2. 您的功能性方法不太容易理解(IMO),它创建了两个不必要的中间数组(引擎 might 对其进行了优化,但是... might >)

  3. “功能/命令式编程”不是黑白的。代码既可以是功能性的,也可以是命令性的,也可以是纯粹的功能性,但是所有这些都取决于您要求的代码。

相关问题