繁体   English   中英

如何创建一个新的自定义(特定)object 和 map 来自 object 数组的数据

[英]How to create create a new custom(specific) object and map the data from Array of object

我从后端得到一个响应,它是一个 object 数组,如下所述

[{"userID":1,"firstName":"George","lastName":"Russell","addressID":"1","address_value":"27 London Street E146AA","expDate":"2022-12-12T17:09:37.000Z"},{"userID":1,"firstName":"George","lastName":"Russell","phoneId":"1","phone_value":"97627445368"},{"userID":2,"firstName":"George","lastName":"Russell","phoneId":"2","phone_value":"07884076692"},{"userID":1,"firstName":"George","lastName":"Russell","emailId":"1","email_value":"georgerussell@outlook.com"},{"userID":1,"firstName":"George","lastName":"Russell","employerId":"1","employer_value":"QMUL"},{"userID":28,"firstName":"Binny","lastName":"Bansal","employerId":"2","employer_value":"Google Inc"},{"userID":1,"firstName":"George","lastName":"Russell","nationalityId":"1","nationality":"Indian"},{"userID":1,"firstName":"George","lastName":"Russell","passportId":"1","passportNumber":"123445567"}]

我正在尝试从后端获取用户的所有详细信息,这些信息存储在不同的表中,例如电话、地址、Email 等的单独表。对于 EmailShared 或 PhoneShared,其中包含有关哪个组织拥有该信息的信息也是如此共享。 我们可以看到,HSBC 有 George 的地址。

但我想要尝试做的是将所有信息放在一个 object 中,而不是每个属性(地址、电话、电子邮件)的不同信息。 我们现在拥有的是下面的

[
    {
      addressID: "1"
      address_value: "27 London Street E146AA"
      expDate: "2022-12-12T17:09:37.000Z"
      firstName: "George"
      lastName: "Russel"
      userID: 1
    },
    {
      firstName: "George"
      lastName: "Russel"
      phoneId: "1"
      phone_value: "97627445368"
      userID: 1
    }
]

我想要实现的是以电话号码和地址为例,但希望拥有所有属性(电话、email、护照、雇主、地址等)。

 {
      addressID: "1"
      address_value: "27 London Street E146AA"
      expDate: "2022-12-12T17:09:37.000Z"
      firstName: "George"
      lastName: "Russel"
      userID: 1
      phoneId: "1"
      phone_value: "97627445368"
      emailId:"1",
      email_value:"georgerussell@outlook.com"
      employerId:"1"
      employer_value:"QMUL"
      nationalityId:"1" 
      nationality:"Indian"
      passportId:"1" 
      passportNumber:"123445567"
    },

我试图使用以下代码来执行此操作,因为我们将userId作为唯一属性,并且基于此我试图拥有所需的 output 但我不明白我在这里缺少什么。

result = data.reduce(function (r, a) {
        r[a.userID] = r[a.userID] || [];
        r[a.userID].push(a);
        return r;
    }, Object.create(null));
console.log(result);
const finalResult = [];
Object.keys(result).forEach(el => {
  result[el].forEach(el1 => {
    console.log(el1)
    //finalResult.push(...el1)
  })
})

你在正确的轨道上,只需要很少的改进,比如使用Object.values()而不是Object.keys() 我使用logical nullish assignment (??=)

 const data = [{"userID":1,"firstName":"George","lastName":"Russell","addressID":"1","address_value":"27 London Street E146AA","expDate":"2022-12-12T17:09:37.000Z"},{"userID":1,"firstName":"George","lastName":"Russell","phoneId":"1","phone_value":"97627445368"},{"userID":2,"firstName":"George","lastName":"Russell","phoneId":"2","phone_value":"07884076692"},{"userID":1,"firstName":"George","lastName":"Russell","emailId":"1","email_value":"georgerussell@outlook.com"},{"userID":1,"firstName":"George","lastName":"Russell","employerId":"1","employer_value":"QMUL"},{"userID":28,"firstName":"Binny","lastName":"Bansal","employerId":"2","employer_value":"Google Inc"},{"userID":1,"firstName":"George","lastName":"Russell","nationalityId":"1","nationality":"Indian"},{"userID":1,"firstName":"George","lastName":"Russell","passportId":"1","passportNumber":"123445567"}]; const result = data.reduce(function(r, a) { r[a.userID]??= []; // it's the same as r[a.userID] = r[a.userID] || []; r[a.userID].push({...a }); return r; }, {}); //Object.create(null) let finalResult = []; Object.values(result).forEach((arrObj) => { let result = {}; Object.values(arrObj).forEach((obj) => { Object.assign(result, obj); }); finalResult.push(result); }); console.log(finalResult);

对于这类问题,我会 go 更改后端服务的运行方式; 它应该在多个表上执行 JOIN,以便您只为每个用户获得一个 object,而不是多个。

话虽这么说,我会用map完成这个最简单的事情。

 const result = [{"userID":1,"firstName":"George","lastName":"Russell","addressID":"1","address_value":"27 London Street E146AA","expDate":"2022-12-12T17:09:37.000Z"},{"userID":1,"firstName":"George","lastName":"Russell","phoneId":"1","phone_value":"97627445368"},{"userID":2,"firstName":"George","lastName":"Russell","phoneId":"2","phone_value":"07884076692"},{"userID":1,"firstName":"George","lastName":"Russell","emailId":"1","email_value":"georgerussell@outlook.com"},{"userID":1,"firstName":"George","lastName":"Russell","employerId":"1","employer_value":"QMUL"},{"userID":28,"firstName":"Binny","lastName":"Bansal","employerId":"2","employer_value":"Google Inc"},{"userID":1,"firstName":"George","lastName":"Russell","nationalityId":"1","nationality":"Indian"},{"userID":1,"firstName":"George","lastName":"Russell","passportId":"1","passportNumber":"123445567"}]; const newUserMap = new Map(); result.forEach((user) => { const { userID } = user; if (newUserMap.has(userID)) { const existingUser = newUserMap.get(userID); newUserMap.set(userID, {...existingUser, ...user}); } else { newUserMap.set(userID, user); } }); console.log(newUserMap);

其中键是用户 ID,其中的值是用户对象。 您还可以使用.forEach()循环遍历每个条目; 就像一个数组。

如果您想将它们保留为对象数组,那么您可以使用类似于 map 的东西来完成此操作,但由于.findIndex() ,它的性能非常昂贵:

 const result = [{"userID":1,"firstName":"George","lastName":"Russell","addressID":"1","address_value":"27 London Street E146AA","expDate":"2022-12-12T17:09:37.000Z"},{"userID":1,"firstName":"George","lastName":"Russell","phoneId":"1","phone_value":"97627445368"},{"userID":2,"firstName":"George","lastName":"Russell","phoneId":"2","phone_value":"07884076692"},{"userID":1,"firstName":"George","lastName":"Russell","emailId":"1","email_value":"georgerussell@outlook.com"},{"userID":1,"firstName":"George","lastName":"Russell","employerId":"1","employer_value":"QMUL"},{"userID":28,"firstName":"Binny","lastName":"Bansal","employerId":"2","employer_value":"Google Inc"},{"userID":1,"firstName":"George","lastName":"Russell","nationalityId":"1","nationality":"Indian"},{"userID":1,"firstName":"George","lastName":"Russell","passportId":"1","passportNumber":"123445567"}]; const newUserArray = []; result.forEach((user) => { const { userID } = user; const existingUserIndex = newUserArray.findIndex(newUser => newUser.userID === userID); if (existingUserIndex.== -1) { newUserArray[existingUserIndex] = Object,assign(newUserArray[existingUserIndex]; user). } else { newUserArray;push(user); } }). console;log(newUserArray);

暂无
暂无

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

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