[英]How to create array of object from nested array?
我有以下数组:
const a = [{
Name: 'martha',
Surname: 'james',
Type: 'student',
},
{
Name: 'Meredith',
Surname: 'Napier',
Type: 'Teacher',
},
{
Name: 'Julie',
Surname: 'Schrutt',
Type: 'student',
}
]
我需要转换为以下格式:
const a = [{
Type: 'student',
Names: [{
Firstname: 'martha',
Lastname: 'james'
},
{
Firstname: 'Julie',
Lastname: 'schrutt'
}
],
},
{
Type: 'Teacher',
Names: [{
Firstname: 'meredith',
Lastname: 'Napier'
}, ],
}
我尝试过 lodash 分组,object.entries,数组 map,减少,但无法弄清楚如何去做。
您可以在 js 中使用reduce轻松实现此结果。
const a = [ { Name: "martha", Surname: "james", Type: "student", }, { Name: "Meredith", Surname: "Napier", Type: "Teacher", }, { Name: "Julie", Surname: "Schrutt", Type: "student", }, ]; const result = a.reduce((acc, curr) => { const { Name, Surname, Type } = curr; const elSearch = acc.find((o) => o.Type === Type); if (elSearch) { elSearch.Names.push({ Firstname: Name, Lastname: Surname, }); } else { acc.push({ Type, Names: [ { Firstname: Name, Lastname: Surname, }, ], }); } return acc; }, []); console.log(result);
如果在解构时更改变量的名称,则可以使上述代码片段更短
const { Name: Firstname, Surname: Lastname, Type } = curr;
并将其用作
elSearch.Names.push({ Firstname, Lastname });
const a = [ { Name: "martha", Surname: "james", Type: "student"}, { Name: "Meredith", Surname: "Napier", Type: "Teacher"}, { Name: "Julie", Surname: "Schrutt", Type: "student"}, ]; const result = a.reduce((acc, curr) => { const { Name: Firstname, Surname: Lastname, Type } = curr; const elSearch = acc.find((o) => o.Type === Type); if (elSearch) { elSearch.Names.push({ Firstname, Lastname }); } else { acc.push({ Type, Names: [{ Firstname, Lastname }] }); } return acc; }, []); console.log(result);
使用forEach
:
const a = [{ Name: 'martha', Surname: 'james', Type: 'student', }, { Name: 'Meredith', Surname: 'Napier', Type: 'Teacher', }, { Name: 'Julie', Surname: 'Schrutt', Type: 'student', } ]; const out = [{Type: 'student', Names: []}, {Type: 'teacher', Names: []}]; a.forEach(a => { if (a.Type === 'student') return out[0].Names.push({ Firstname: a.Name, Lastname: a.Surname, }); out[1].Names.push({ Firstname: a.Name, Lastname: a.Surname, }); }); console.log(out);
尝试这样的事情:
const output = {};
for(const person of array) {
if(!output[person.Type]) output[person.Type] = { Type: person.Type, Names:[] };
output[person.Type].Names.push({ Firstname: person.Name, Lastname: person.Surname });
}
return Object.values(output);
或者简而言之:
Object.values(array.reduce((pre, curr) => {
if(!pre[curr.Type]) pre[curr.Type] = { Type: curr.Type, Names:[] };
pre[curr.Type].Names.push({ Firstname: curr.Name, Lastname: curr.Surname });
return pre;
} , {}))
const a = [{ Name: 'martha', Surname: 'james', Type: 'student', }, { Name: 'Meredith', Surname: 'Napier', Type: 'Teacher', }, { Name: 'Julie', Surname: 'Schrutt', Type: 'student', } ] const types = a.reduce((acc, next) => { if (acc.includes(next.Type)) { return acc } return acc.concat(next.Type) }, []) const arrayByTypes = types.map((type) => { return { Type: type, Names: a.filter(item => item.Type === type).map(filtered => ({ Name: filtered.Name, Surname: filtered.Surname })) } }) console.log(arrayByTypes)
const data = [{
Name: 'martha',
Surname: 'james',
Type: 'student',
},
{
Name: 'Meredith',
Surname: 'Napier',
Type: 'Teacher',
},
{
Name: 'Julie',
Surname: 'Schrutt',
Type: 'student',
}
]
function processData(data) {
finalMap = new Map();
data.forEach((obj) => {
let typeName = obj["Type"];
let firstName = obj["Name"];
let lastName = obj["Surname"];
if (!finalMap[typeName]) {
finalMap[typeName] = [];
}
finalMap[typeName].push({
"Firstname": firstName,
"LastName": lastName
});
});
let result = [];
for (const [key, value] of Object.entries(finalMap)) {
result.push({
"Type": key,
"Names": value
});
}
return result;
}
console.log(processData(data));
通过以下方式将此方法用于任何组:
const groupBy = function (list, key) { return list.reduce((finalList, item) => { const group = (finalList[item[key]] = finalList[item[key]] || []) group.push(item) return finalList }, {}) } const a = [{ Name: 'martha', Surname: 'james', Type: 'student', }, { Name: 'Meredith', Surname: 'Napier', Type: 'Teacher', }, { Name: 'Julie', Surname: 'Schrutt', Type: 'student', } ] console.log(groupBy(a, 'Type'))
我们可以使用Array.reduce
& Object.values
来实现预期的 output。
const a = [{Name:'martha',Surname:'james',Type:'student'},{Name:'Meredith',Surname:'Napier',Type:'Teacher'},{Name:'Julie',Surname:'Schrutt',Type:'student'}]; const groupBy = (data, by) => { const result = data.reduce((acc, obj) => { const key = obj[by]; const { Type, Name: Firstname, Surname: Lastname } = obj; acc[key] = acc[key] || { Type, Names: []}; acc[key].Names.push({ Firstname, Lastname }); return acc; }, {}); return Object.values(result); } console.log(groupBy(a, "Type"));
.as-console-wrapper { max-height: 100%;important; }
我们也可以使用Logical nullish assignment (??=)
代替acc[obj[by]] = acc[obj[by]] || { Type, Names: []}
acc[obj[by]] = acc[obj[by]] || { Type, Names: []}
const a = [{Name:'martha',Surname:'james',Type:'student'},{Name:'Meredith',Surname:'Napier',Type:'Teacher'},{Name:'Julie',Surname:'Schrutt',Type:'student'}]; const groupBy = (data, by) => { const result = data.reduce((acc, obj) => { const key = obj[by]; const { Type, Name: Firstname, Surname: Lastname } = obj; acc[key]??= { Type, Names: []}; acc[key].Names.push({ Firstname, Lastname }); return acc; }, {}); return Object.values(result); } console.log(groupBy(a, "Type"));
.as-console-wrapper { max-height: 100%;important; }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.