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),
}),
),
),
);