我正在使用纯函数来修改对象数组,但是在修改userDetails对象时面临一些挑战。
我的要求改为 1 ,我需要在权限对象内显示 true 。请检查我的代码并提出建议。我知道,我在犯一些小错误,但仍在尝试识别。
我不希望主数据源受到影响。请建议您是否还有其他好的选择
let data = [
{ id: 1,
title: 'admin1',
permissions: {
userDetails: { activeUser: 1, team: null},
salaryList: { abc: 1, def: 2, asdf: 0, poi: 1}
}
},
{ id: 1,
title: 'admin1',
permissions: {
userDetails: { activeUser: 1, team: null},
salaryList: { abc: 0, def: 1, asdf: null, poi: 0,wew: 1, aaa: 1}
}
},
]
let modifiedObjs = data.map( record => {
return {
id: record.id,
title: record.title + " Edited Object",
permissions: handlePermission(record.permissions)
}
})
function handlePermission(permissions){
Object.keys(permissions).forEach((key)=> {
Object.keys(permissions[key]).forEach((obj) => {
if(permissions[key][obj]===null){
delete permissions[key][obj]
}else{
const value = permissions[key][obj];
const finalV = value === 0? false : value ===1? true : value === 2 ? null : value;
permissions[key][obj] = finalV
}
})
})
return permissions
}
console.log(data, "main data")
console.log(modifiedObjs, "modified data")
答案 0 :(得分:0)
代码的主要问题是permissions
是handlePermission
内部的引用,这意味着当您从其中delete
进行访问时,密钥也将从您的计算机中删除。原始对象(因为它们共享相同的参考)。解决此问题的一种方法是改建 new 对象。只要找到要保留的密钥,就可以将其添加到新对象中。然后,不能删除键,而不能删除键/值。
请参见以下示例:
const data = [{ id: 1, title: 'admin1', permissions: { userDetails: { activeUser: 1, team: null }, salaryList: { abc: 1, def: 2, asdf: 0, poi: 1 } } }, { id: 1, title: 'admin1', permissions: { userDetails: { activeUser: 1, team: null }, salaryList: { abc: 0, def: 1, asdf: null, poi: 0, wew: 1, aaa: 1 } } }, ];
let modifiedObjs = data.map( record => {
return {
id: record.id,
title: record.title + " Edited Object",
permissions: handlePermission(record.permissions)
}
});
function handlePermission(permissions){
const newPermissions = {};
Object.keys(permissions).forEach((key)=> {
newPermissions[key] = {}; // set object for key
Object.keys(permissions[key]).forEach((obj) => {
if(permissions[key][obj]!==null){
const value = permissions[key][obj];
const finalV = value === 0? false : value ===1? true : value === 2 ? null : value;
newPermissions[key][obj] = finalV;
}
});
});
return newPermissions;
}
console.log(data, "main data")
console.log(modifiedObjs, "modified data")
我将改为这样处理,它使用Object.entries()
从对象中获取[key, value]
对条目数组,并使用Object.fromEntries()
在对象值确定后重建对象mapped / filtered:
const data = [{ id: 1, title: 'admin1', permissions: { userDetails: { activeUser: 1, team: null }, salaryList: { abc: 1, def: 2, asdf: 0, poi: 1 } } }, { id: 1, title: 'admin1', permissions: { userDetails: { activeUser: 1, team: null }, salaryList: { abc: 0, def: 1, asdf: null, poi: 0, wew: 1, aaa: 1 } } }, ];
const modifiedObjs = data.map(({id, title, permissions}) => ({
id,
title: title + " Edited Object",
permissions: Object.fromEntries(Object.entries(permissions).map(([key, obj]) => [
key,
Object.fromEntries(Object.entries(obj).filter(([,v]) => v !== null)
.map(([k, v]) => [k, v > 1 ? null : !!v]))
]))
}));
console.log(data, "main data");
console.log(modifiedObjs, "modified data");