[英]Split array of objects with different properties names into an object and separate them by a given name
我有一個包含對象的數組。 現在我想將數組切片為一個新對象,該對象僅包含與某個屬性名稱匹配並按此屬性名稱分組的那些對象。 問題是我也有它們之間不同的屬性名稱。 名稱和 ID 在對象數組中重復,但在新對象內部,它應該只包含一次 ID 和名稱。
原始數組如下所示:
let personArray = [
{
id_dentist: 1,
dentist_name: 'John',
id_secretary: 6,
secretary_name: 'Paul',
id_security: 3,
security_name: 'Carl'
},
{
id_dentist: 2,
dentist_name: 'Lisa',
id_secretary: 9,
secretary_name: 'Beth',
id_security: 5,
security_name: 'Monica'
},
{
id_dentist: 1,
dentist_name: 'John',
id_secretary: 6,
secretary_name: 'Paul',
id_security: 3,
security_name: 'Carl'
}
];
新對象應如下所示:
let personObject = {
dentist: [
{ id_dentist: 1, dentist_name: 'John' },
{ id_dentist: 2, dentist_name: 'Lisa' },
],
secretary: [
{ id_secretary: 6, secretary_name: 'Paul' },
{ id_secretary: 9, secreatary_name: 'Beth' },
],
security: [
{ id_security: 3, security_name: 'Carl' },
{ id_security: 5, security_name: 'Monica' }
]
};
我很感激幫助。
根據要求,我嘗試使用reduce()
和filter()
,但我無法將它們拆分。 這是代碼:
const obj = personArray.reduce((acc, cur) => {
const key = Object.keys(cur).filter(f => /^id_/.test(f))[0].split('_')[1];
if (!acc[key]) acc[key] = [];
acc[key].push(cur);
return acc;
}, {});
console.log(obj);
關於奇怪的數據結構,我使用SELECT
SQL 語法從數據庫中獲取這些數據。
給你,這可以進一步增強
let personArray = [{"id_dentist":1,"dentist_name":"John","id_secretary":6,"secretary_name":"Paul","id_security":3,"security_name":"Carl"},{"id_dentist":2,"dentist_name":"Lisa","id_secretary":9,"secretary_name":"Beth","id_security":5,"security_name":"Monica"},{"id_dentist":1,"dentist_name":"John","id_secretary":6,"secretary_name":"Paul","id_security":3,"security_name":"Carl"}]; const personObject = { dentist: [], secretary: [], security: [] }; const isExist = (arr, id, key) => arr.find(x => x[key] === id); personArray.reduce((personObj, person) => { const isDentistExists = isExist(personObj.dentist, person.id_dentist, 'id_dentist'); if (!isDentistExists) { personObj.dentist.push({ id_dentist: person.id_dentist, dentist_name: person.dentist_name }); } const isSecretaryExists = isExist(personObj.secretary, person.id_secretary, 'id_secretary'); if (!isSecretaryExists) { personObj.secretary.push({ id_secretary: person.id_secretary, secretary_name: person.secretary_name }); } const isSecurityExists = isExist(personObj.security, person.id_security, 'id_security'); if (!isSecurityExists) { personObj.security.push({ id_security: person.id_security, security_name: person.security_name }); } return personObj; }, personObject); console.log(personObject);
這不是一個簡單的算法。 這是一個 [大部分] 功能實現,可以處理任意數量的 id 和名稱
let personArray = [ { id_dentist: 1, dentist_name: 'John', id_secretary: 6, secretary_name: 'Paul', id_security: 3, security_name: 'Carl', }, { id_dentist: 2, dentist_name: 'Lisa', id_secretary: 9, secretary_name: 'Beth', id_security: 5, security_name: 'Monica', }, { id_dentist: 1, dentist_name: 'John', id_secretary: 6, secretary_name: 'Paul', id_security: 3, security_name: 'Carl', }, ] const parsed = Object.fromEntries( Object.keys(personArray[0]) .filter(key => key.startsWith('id_')) .map(id => { const uniqIds = [...new Set(personArray.map(person => person[id]))] const [, name] = id.split('_') const matchingPeople = uniqIds.map(uniqId => { return personArray.find(person => uniqId === person[id]) }) return matchingPeople.map(person => ({ [id]: person[id], [`${name}_name`]: person[`${name}_name`], })) }) .filter(entry => entry.length > 0) .map(groupedPeople => { const [name] = Object.keys(groupedPeople[0]) .find(key => key.includes('_name')) .split('_') return [name, groupedPeople] }) ) console.log(parsed)
我可能走了一條與@Andrew 類似的道路,是的,我也承認,這並不是微不足道的。
更改您的 SQL 選擇可能是一個更好的主意,以避免接收使這些冗長轉換成為必要的冗余數據。
const arr = [ { id_dentist: 1, dentist_name: 'John', id_secretary: 6, secretary_name: 'Paul', id_security: 3, security_name: 'Carl' }, { id_dentist: 2, dentist_name: 'Lisa', id_secretary: 9, secretary_name: 'Beth', id_security: 5, security_name: 'Monica' }, { id_dentist: 1, dentist_name: 'John', id_secretary: 6, secretary_name: 'Paul', id_security: 3, security_name: 'Carl' } ], types=Object.keys(arr[0]).reduce((a,c,k)=>{ k=c.match(/id_(.*)/); if(k) a.push(k[1]); return a; },[]); const res=Object.entries(arr.reduce((a,c)=>{ types.forEach((t,id)=>{ id="id_"+t; a[t+":"+c[id]]={[id]:c[id],[t+"_name"]:c[t+"_name"]} }); return a; },{})).reduce((a,[k,o],n)=>{ [n]=k.split(":"); (a[n]=a[n]||[]).push(o) return a; },{}); console.log(res);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.