Javascript中的函数循环与非函数循环
我想做的是返回一个基于动态大小的对象数组,我觉得这样做可能过于复杂,但我现在也在尝试以更实用的方式做事情 下面是我将如何以非功能性的方式来做这件事Javascript中的函数循环与非函数循环,javascript,functional-programming,Javascript,Functional Programming,我想做的是返回一个基于动态大小的对象数组,我觉得这样做可能过于复杂,但我现在也在尝试以更实用的方式做事情 下面是我将如何以非功能性的方式来做这件事 功能无效(大小){ 设foo=[]; for(让索引=0;索引{ 返回{ 酒吧:“巴兹” } }); } 这是以功能性方式实现这一点的最佳方式吗 与“传统”方式相比,这种方式有哪些优点/缺点 这真的与函数式编程有关吗 我会做(不一定更好): 您的函数方式可读性较差(IMO),它会创建两个不必要的中间数组(引擎可能会对其进行优化,但……很可能会)
功能无效(大小){
设foo=[];
for(让索引=0;索引
下面是我如何以一种实用的方式来做这件事
功能(尺寸){
返回[…新数组(大小)].map(()=>{
返回{
酒吧:“巴兹”
}
});
}
您已经有了一个很好的开始,即确定此行为应该在其自身的功能中隔离。但“功能”并不局限于像
map
、reduce
和filter
这样的常用方法
考虑下面的buildArray
-
const identity=x=>
x
const buildArray=(大小=0,f=identity)=>
大小===0
? []
:[…buildArray(大小-1,f),f(大小-1)]
console.log(buildArray(5))
// [ 0, 1, 2, 3, 4 ]
log(buildArray(5,x=>x*x))
// [ 0, 1, 2, 3, 16 ]
log(buildArray(3,()=>({a:1})))
//[{a:1},{a:1},{a:1}]
console.log(buildArray())
//[]
您已经有了一个很好的开始,即确定此行为应该在其自身的函数中隔离。但“功能”并不局限于像map
、reduce
和filter
这样的常用方法
考虑下面的buildArray
-
const identity=x=>
x
const buildArray=(大小=0,f=identity)=>
大小===0
? []
:[…buildArray(大小-1,f),f(大小-1)]
console.log(buildArray(5))
// [ 0, 1, 2, 3, 4 ]
log(buildArray(5,x=>x*x))
// [ 0, 1, 2, 3, 16 ]
log(buildArray(3,()=>({a:1})))
//[{a:1},{a:1},{a:1}]
console.log(buildArray())
//[]
返回数组(大小)。填充({bar:“baz”})代码>您的代码不起作用,因为您将thunk传递给映射
,即没有参数的函数。在FP中,与严格评估的语言结合使用,显式thunks仅用于获得懒散。同样在Javascript中,由于缺乏类型系统和这样的系统所需要的保证,您可以在本地应用突变,以便它们在父范围中不可见。returnarray(size).fill({bar:“baz”})代码>您的代码不起作用,因为您将thunk传递给映射
,即没有参数的函数。在FP中,与严格评估的语言结合使用,显式thunks仅用于获得懒散。同样在Javascript中,由于缺乏类型系统和这样一个系统所需要的保证,您可以在本地应用突变,这样在父范围中就看不到它们了。感谢您的回复,我不知道为什么所有事情都被否决了。至于可读性,这是我关心的问题之一,但我想我喜欢你所说的。这可能是我得到的最好的答复。谢谢again@jeffbeltran它可能被认为是固执己见/过于宽泛,可能被认为是离题的。因此,毕竟是民主的,两个人认为答案不合适,三个人认为答案合适(或者是你的投票结果),多数人获胜:)Array。从(Array(size),…)
中,那些不熟悉JS奇怪的“Array-like”行为的人会更清楚。谢谢你的回答,但我不知道为什么所有的事情都被否决了。至于可读性,这是我关心的问题之一,但我想我喜欢你所说的。这可能是我得到的最好的答复。谢谢again@jeffbeltran它可能被认为是固执己见/过于宽泛,可能被认为是离题的。因此,毕竟是民主的,两个人认为答案不合适,三个人认为答案合适(或者是你的投票结果),大多数人获胜:)Array。从(Array(size),…)
会让那些不熟悉JS奇怪的“Array-like”行为的人更清楚。这太棒了,谢谢。虽然我的例子很做作,但最后一点是我真正想做的。这太棒了,谢谢。虽然我的例子很做作,但最后一点是我真正想做的。
return Array.from({ length: size }, () => ({ bar: "baz" }));