繁体   English   中英

javascript通过映射更新基于另一个对象的对象键/值

[英]javascript update object key/value based on another object by mapping

我正在遍历某个对象并根据一些查找更新另一个对象的值,当前我在获取映射中的正确值时遇到问题。

let users = [
  {
    "id": "123",
    "email": "john.doe@acme.com",
    "name": " John Doe",
    "group": "1",
    "subgroup": "1"
  },
  {
    "id": "456",
    "email": "tom.hans@stk.com",
    "name": " Tom hans",
    "group": "2",
    "subgroup": "1"
  }
];

let groupData = [
  {
    id: "1",
    name: "Stars",
    subgroup: [
        {
          id: "1",
          pseudo: "big"
        },
        {
          id: "2",
          pseudo: "small"
        }
      ]
  },
  {
    id: "2",
    name: "Stones",
    subgroup: [
        {
          id: "1",
          pseudo: "tiny"
        },
        {
          id: "2",
          pseudo: "huge"
        }
      ]
  }
];

const allUsers = {};
for (var i = 0; i < users.length; i++) {
    let groupID = users[i].group,
        subgroupID = users[i].subgroup;

    users[i].group = users[i].group ? groupData[groupID][name] : '';
    users[i].subgroup = users[i].subgroup ?
        groupData[groupID].subgroup[subgroupID][name] : '';

    allUsers[users[i].id] = users[i];
}

allUsers的结果将如下所示:

{
  123: {
    "id": "123",
    "email": "john.doe@acme.com",
    "name": " John Doe",
    "group": "Stars",
    "subgroup": "big"
  },
  456: {
    "id": "456",
    "email": "tom.hans@stk.com",
    "name": " Tom hans",
    "group": "Stones",
    "subgroup": "tiny"
  }
};

当前,我在for loop存在查找问题for loop以获取组/子组的名称。

有人可以解决这个问题吗? 最好使用ecma6。

您正在使用groupData,就像它是groupID的键一样。 但是,它是一个数组。 您应该尝试使用它的find方法:

const allUsers = {};
for (var i = 0; i < users.length; i++) {
    let groupID = users[i].group,
        subgroupID = users[i].subgroup;
    let userGroup = groupData.find(group => group.id === groupID);

    users[i].group = userGroup.name
    users[i].subgroup = userGroup.subgroup.find(subgroup => subgroup.id === subgroupID).pseudo;

    allUsers[users[i].id] = users[i];
}

虽然您正在修改原始数据,但这并不是一个好主意。 您可以在循环中创建一个新用户,并使用Object.assign避免这种情况。


这是我只用reduce方法要做的事情:

const allUsers = users.reduce((data, user) => {
    const group = groupData.find(group => group.id === user.group);
    const name = group ? group.name : '';
    const subGroup = group ? group.subgroup.find(subgroup => subgroup.id === user.subgroup): null;
    const pseudo = subGroup ? subGroup.pseudo : '';
    data[user.group] = Object.assign({}, user, { group: name, subGroup: pseudo });
   return data;
}, {});

Object.assign创建一个新对象,因此不会突变现有用户。

您可以使用array#reduce来累积用户,并使用array#find来获取group名和subgroup pseudo名。

 let users = [ { "id": "123", "email": "john.doe@acme.com", "name": " John Doe", "group": "1", "subgroup": "1" }, { "id": "456", "email": "tom.hans@stk.com", "name": " Tom hans", "group": "2", "subgroup": "1" } ], groupData = [ { id: "1", name: "Stars",subgroup: [ { id: "1", pseudo: "big" }, { id: "2", pseudo: "small" } ] }, { id: "2", name: "Stones", subgroup: [ { id: "1", pseudo: "tiny" }, { id: "2", pseudo: "huge" } ] } ], result = users.reduce((r, user) => { var {name = '', subgroup = []} = groupData.find(o => o.id === user.group); r[user.id] = Object.assign({}, user, {group: name}, {subgroup: subgroup.find(o => o.id === user.subgroup).pseudo||''}); return r; }, {}); console.log(result); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM