【问题标题】:javascript update object key/value based on another object by mappingjavascript 通过映射根据另一个对象更新对象键/值
【发布时间】:2018-01-07 12:24:43
【问题描述】:

我正在循环某个对象并根据一些查找更新另一个对象的值,目前我无法在映射中获取正确的值。

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 中查找问题以获取组/子组的名称。

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

【问题讨论】:

    标签: javascript arrays object for-loop ecmascript-6


    【解决方案1】:

    您正在使用 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 创建一个新对象,因此它不会改变现有用户。

    【讨论】:

    • 在这个例子中如何使用对象assign?我们是否也可以用一些映射/过滤等替换那个 for 循环?
    • 如果用户没有任何组或子组会怎样?我们如何传递' ' 空值?我的意思是组/子组字段根本不存在。
    • 最后一行有语法错误...你能看一下吗?
    • 第二种方法输出未定义,只返回第一个用户的错误数据。
    • 第二个代码段是第一个代码段的一部分吗?还是独立的?
    【解决方案2】:

    您可以使用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);

    【讨论】:

    • 如果用户没有group 字段会怎样?但他有子组......基本上这意味着,我们不能返回任何值,所以我们应该为两者都返回空。
    • 更新这一行user.group &amp;&amp; groupData.find(o =&gt; o.id === user.group);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-12
    • 2020-06-23
    • 2020-03-11
    相关资源
    最近更新 更多