[英]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.