Javascript 嵌套数组上的函数编程

Javascript 嵌套数组上的函数编程,javascript,arrays,functional-programming,Javascript,Arrays,Functional Programming,我正在尝试做越来越多的函数式编程,而不是命令式编程 假设我有一个嵌套的数组数据结构,我想更改深层内部数组的值,那么最好的方法是什么 要转换的命令代码: for (let i = 0; i < dataSheet.length; i++) { for (let j = 0; j < dataSheet[i].questions.length; j++) { for (let k = 0; k < dataSheet[i].questions[j].answ

我正在尝试做越来越多的函数式编程,而不是命令式编程

假设我有一个嵌套的数组数据结构,我想更改深层内部数组的值,那么最好的方法是什么

要转换的命令代码:

for (let i = 0; i < dataSheet.length; i++) {
    for (let j = 0; j < dataSheet[i].questions.length; j++) {
        for (let k = 0; k < dataSheet[i].questions[j].answers.length; k++) {
            dataSheet[i].questions[j].answers[k].name += ' (edited name)';
            dataSheet[i].questions[j].answers[k].value = 1 + dataSheet[i].questions[j].answers[k].value / 10;
        }
    }
}
使用forEach():

这三个都做同样的事情,但没有一个看起来更好。 它看起来并不好,特别是因为厄运金字塔。。。如果我有更深的嵌套数组,情况可能会更糟

在这种情况下,从命令式转换为函数式并不能使代码更加清晰/可读/可维护,而且可能会更慢,因为它会为每个修改的对象创建一个新的副本

因此,在这个场景中,您认为以命令式的方式保存代码会更好吗?还是有更好的方法

在这种情况下,从命令式转换为函数式并不能使代码更加清晰/可读/可维护,而且可能会更慢,因为它会为每个修改的对象创建一个新的副本

我认为

.map(答案=>[code block])

它的可读性比

for(设k=0;k

虽然您无法通过
map
示例消除嵌套,但您获得了许多好处,使代码更易于维护

  • 你们不能和i,j,k捣乱。。变量并引入错误
  • 你得到了纯度,这是进行函数式编程的主要原因。对于这种简单的情况,
    map
    可能会慢一些,但通过这种方式,您可以在保持完整性的同时,允许您的输入是不可变的,并在其他地方使用/存储
forEach
无法工作,因为它不返回任何内容)


我建议您使用函数式方法,因为命令式方法除了性能上的微不足道之外,没有任何优势。

您可以先决定是否只更改最内部的项或返回全新的数组。顺便说一句,lasat没有任何意义,因为返回值不会返回(在回调之外)。我认为forEach代码不会像原始代码那样执行,也不会像.map代码那样执行。通常,您会使用函数镜头。透镜将嵌套数组视为持久数据结构。但JS本质上是一种不纯的语言(尽管它包括功能部分)。因此,您需要一个合适的lib,除非您愿意手工实现它。我会推荐拉姆达,因为它对初学者来说非常棒。
dataSheet
.map(section => section.questions
    .map(question => question.answers
        .map(answer => (
            {
                ...answer,
                name: answer.name + ' (edited name)',
                value: 1 + (answer.y / 10),
            }),
        ),
    ),
);
dataSheet.forEach(section => section.questions
    .forEach(question => question.answers
        .forEach(answer => (
            {
                ...answer,
                name: answer.name + ' (edited name)',
                value: 1 + (answer.y / 10),
            }),
        ),
    ),
);