Javascript 如何使用通过参数传递的函数对给定的必填字段进行复杂对象格式化?

Javascript 如何使用通过参数传递的函数对给定的必填字段进行复杂对象格式化?,javascript,functional-programming,logic,Javascript,Functional Programming,Logic,我试图创建一个函数,该函数通过一个复杂的对象格式化数组中的给定字段 函数必须接收必须格式化的对象,然后下一个参数是具有必须格式化属性的数组,最后一个函数接收将格式化字段值的函数 函数必须返回其原始结构中的对象 我的代码到现在为止: const formatFields=(obj={})=>(fieldsToFormat=[])=>(formatFunction=()=>{})=>{ 设newObj={…obj}; for(让[k,v]为对象项(obj)){ if(typeof v=='objec

我试图创建一个函数,该函数通过一个复杂的对象格式化数组中的给定字段

函数必须接收必须格式化的对象,然后下一个参数是具有必须格式化属性的数组,最后一个函数接收将格式化字段值的函数

函数必须返回其原始结构中的对象

我的代码到现在为止:

const formatFields=(obj={})=>(fieldsToFormat=[])=>(formatFunction=()=>{})=>{
设newObj={…obj};
for(让[k,v]为对象项(obj)){
if(typeof v=='object'&&v!==null)formatFields(v)(fieldsToFormat)(formatFunction);
if(fieldsToFormat.includes(k))newObj={…newObj[k]:formatFunction(v)};
else newObj={…newObj[k]:v};
}
返回newObj;
}
常量toMoney=(num)=>“$”+num;
常量obj={
总额:83.24,
报价项目:
[{max:'1',
代码:“1”,
数量:1,
售价:23.21,
总价:23.21,
描述:“测试”
},{ 
马克斯:“3”,
代码:'2',
数量:3,
售价:20.01,
总价:60.03,
描述:'test2'
} ],
};
常量priceFormatAttributes=[
“单价”,
“总价格”,
“总金额”
];
log(formatFields(obj)(priceFormatAttributes)(toMoney));
嵌套对象未格式化

我知道这是一个合乎逻辑的问题。。。这很有挑战性,我无法继续前进

我认为递归是错误的,但我不明白为什么


如果有人知道如何用另一种方法解决这个问题,我也很欢迎。

虽然我不确定预期的结果是什么,但我会尝试以下方法:

const formatFields=(obj={})=>(fieldsToFormat=[])=>(formatFunction=()=>{})=>{
让newObj={…obj};//克隆对象以防止更改原始对象
if(Array.isArray(obj)){//也必须处理数组,除非您想将它们全部更改为对象
newObj=[…obj];
}
for(让Object.entries(obj))的[key,value]{
if(Array.isArray(newObj)){
newObj.splice(键-1,1);//从中删除上一个
push(formatFields(value)(fieldsToFormat)(formatFunction));
}
else if(typeof value==='object'&&value!==null){
newObj={…newObj[key]:formatFields(value)(fieldsToFormat)(formatFunction)};
}
else if(fieldsToFormat.includes(key)){
newObj[key]=formatFunction(值)
}
else newObj={…newObj[key]:value};
}
返回newObj;
}
const toMoney=(num)=>{
返回“$”+num;
}
常量对象={
总额:83.24,
报价项目:[
{
最大值:“1”,
代码:“1”,
数量:1,
售价:23.21,
总价:23.21,
描述:'测试',
},
{
马克斯:“3”,
代码:'2',
数量:3,
售价:20.01,
总价:60.03,
description:'test2',
}
],
};
常量priceFormatAttributes=[
“单价”,
“总价格”,
“总金额”,
];

log(formatFields(obj)(priceFormatAttributes)(toMoney))
首先,
formatFields
返回一个对象,那么您将如何执行一个对象。你不能。为什么复杂的函数会返回函数呢?我不明白为什么
formatFields
不能只有三个参数?@Dominik这里没有HOC,只有闭包……你的实际目标是什么?对象属性是最容易访问的。不要让事情变得更复杂。@EugenSunic你说得对。我编辑了评论。在第4行,您没有将
formatFields
的结果返回到您的结果中,这是递归断点正在格式化的地方,但更改了对象格式。。。快到了。。。数组中一个对象的属性正在覆盖超出对象格式的格式化字段。。。我需要这个函数保持对象结构。也许你可以编辑一下你的问题,把所有这些部分都包括进去,我以后再看。我编辑了我的答案。如果这是你想要的,请告诉我。