Javascript 使用ES6纯函数修改对象数组

Javascript 使用ES6纯函数修改对象数组,javascript,ecmascript-6,Javascript,Ecmascript 6,我正在使用纯函数修改一个对象数组,但在修改userDetails对象时面临一些挑战 我的要求是1,我需要在权限对象中显示true。请检查我的代码并提出建议。我知道,我犯了一些小错误,但仍在努力识别 我不希望主数据源受到影响。如果您还有其他好的选择,请提出建议 let数据=[ {id:1, 标题:“admin1”, 权限:{ userDetails:{activeUser:1,team:null}, salaryList:{abc:1,def:2,asdf:0,poi:1} } }, {id:1

我正在使用纯函数修改一个对象数组,但在修改userDetails对象时面临一些挑战

我的要求是1,我需要在权限对象中显示true。请检查我的代码并提出建议。我知道,我犯了一些小错误,但仍在努力识别

我不希望主数据源受到影响。如果您还有其他好的选择,请提出建议

let数据=[
{id:1,
标题:“admin1”,
权限:{
userDetails:{activeUser:1,team:null},
salaryList:{abc:1,def:2,asdf:0,poi:1}
}
},
{id:1,
标题:“admin1”,
权限:{
userDetails:{activeUser:1,team:null},
salaryList:{abc:0,def:1,asdf:null,poi:0,wew:1,aaa:1}
}
},
]
让modifiedObjs=data.map(记录=>{
返回{
id:record.id,
标题:record.title+“已编辑对象”,
权限:handlePermission(record.permissions)
}
})
函数handlePermission(权限){
Object.key(权限).forEach((key)=>{
Object.key(权限[key]).forEach((obj)=>{
if(权限[key][obj]==null){
删除权限[key][obj]
}否则{
const value=权限[key][obj];
const finalV=value==0?false:value==1?true:value==2?null:value;
权限[key][obj]=finalV
}
})
})
返回权限
}
控制台日志(数据,“主数据”)

console.log(modifiedObjs,“modified data”)
您的代码的主要问题是
权限
handlePermission
中的一个引用,这意味着当您从中
删除
时,密钥也将从原始对象中删除(因为它们共享相同的引用)。解决这个问题的一种方法是构建一个新对象。无论何时找到要保留的密钥,都可以将其添加到新对象中。然后,您可以简单地不向对象添加键/值,而不是删除

见下例:

const data=[{id:1,title:'admin1',权限:{userDetails:{activeUser:1,team:null},salaryList:{abc:1,def:2,asdf:0,poi:1}},{id:1,title:'admin1',权限:{userDetails:{activeUser:1,team:null},salarist abc:0,def:1,asdf null,poi:0,wew:1,aaa:1},];
让modifiedObjs=data.map(记录=>{
返回{
id:record.id,
标题:record.title+“已编辑对象”,
权限:handlePermission(record.permissions)
}
});
函数handlePermission(权限){
const newPermissions={};
Object.key(权限).forEach((key)=>{
newPermissions[key]={};//为key设置对象
Object.key(权限[key]).forEach((obj)=>{
if(权限[key][obj]!==null){
const value=权限[key][obj];
const finalV=value==0?false:value==1?true:value==2?null:value;
newPermissions[key][obj]=finalV;
}
});
});
返回新的权限;
}
控制台日志(数据,“主数据”)

log(modifiedObjs,“modifieddata”)
这个三元链真的很难看,很难读。我会选择switch。您能使用es6及以上功能吗?或者只使用es6及以下功能吗?我想使用es6及以上功能。我建议您先复制权限,并将
handlePermission
设置为纯功能。(在末尾返回)。然后你可以简化一下三元数,比如:
value==0?false:值===1?true:null
(您能拥有3个以上的值吗?)。请guide@AnandDeepSingh请参阅ES6Way(解决方案的修改版本)的第一个代码段。Object.fromEntries()可以使用其他方法实现,例如
reduce
和/或
Object.assign
,它们是ES6,但这将给
.map()
方法增加更多的复杂性。使用Object.fromEntries()是否存在特殊问题?您似乎对使用ES6+功能很满意,非常感谢Nick。你对JS有极好的了解。爱你的解决方案。事实上,我也在努力实现同样的目标,但坚持这种方法