使用ES6 Pure函数修改对象数组

时间:2020-09-30 13:54:30

标签: javascript ecmascript-6

我正在使用纯函数来修改对象数组,但是在修改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")

1 个答案:

答案 0 :(得分:0)

代码的主要问题是permissionshandlePermission内部的引用,这意味着当您从其中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");