簡體   English   中英

將具有不同屬性名稱的對象數組拆分為一個對象,並用給定名稱分隔它們

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM