2017-12-03 164 views
1

您好,我試圖結合一個對象數組,並需要最終的結果是一個對象的數組,其中一個attr是唯一的,另一個是具有所有值的數組從原始的按屬性組合對象數組

陣列第二ATTR我:

let arr = [ 
    { 
     name: 'cdd_register', 
     levels: 'read' 
    }, { 
     name: 'cdd_register', 
     levels: 'write' 
    }, { 
     name: 'annual_reports', 
     levels: 'write' 
    } 
]; 

而且我希望得到的結果是:

let result = [ 
    { 
     name: 'cdd_register', 
     levels: ['read', 'write'] 
    }, { 
     name: 'annual_reports', 
     levels: 'write' 
    } 
]; 

我從後端

data: [{ 
    id:1 
    label: "Administrator" 
    name: "admin" 
    permissions:{ 
     data: [{ 
      id: 4, 
      name: "cdd_register.read", 
      label: "Read access on CDD Register module" 
     }, { 
      id: 6, 
      name: "cdd_register.write", 
      label: "Write access on CDD Register module" 
     }, { 
      id: 7, 
      name: "annual_reports.write", 
      label: "Write access on Annual Reports module" 
     }] 
    } 
}] 

這種答覆,這

getModules(roles) { 
    let modules = []; 

    _.forEach(roles, role => { 
     _.forEach(role.permissions.data, permission => { 
      modules.push(permission); 
     }) 
    }); 

    return _.uniqBy(modules, 'id').map(module => { 
     let moduleArray = module.name.split('.'); 
      return { 
       name: moduleArray[0], 
       levels: moduleArray[1] 
      } 
     }); 
    } 
} 

後,我有結果,因爲它是現在,但無法弄清楚做的最好的方式(乾淨)。

謝謝。

+1

嗨。歡迎來到SO。您需要以[mcve]的形式添加您已處理的代碼。 – Andy

+0

對不起,使用服務器@Andy – ezekkiel

回答

0

這可以用許多不同的方法完成。一種可能的方法可以使用一些魔法的功能

let arr = [{ 
 
    name: 'cdd_register', 
 
    levels: 'read' 
 
}, { 
 
    name: 'cdd_register', 
 
    levels: 'write' 
 
}, { 
 
    name: 'annual_reports', 
 
    levels: 'write' 
 
}]; 
 

 
let result = arr.reduce((acc, x) => { 
 
    const found = acc.find(y => (x.name == y.name)); 
 
    if (!found) { 
 
    acc.push({ 
 
     name: x.name, 
 
     levels: arr 
 
     .filter(y => (x.name == y.name)) 
 
     .map(z => (z.levels)) 
 
    }); 
 
    } 
 
    return acc; 
 
}, []) 
 

 
console.log(result)

+0

感謝@ncardeli提供的代碼和響應示例進行了更新,這就是我一直在尋找的解決方案:) – ezekkiel

+0

樂於提供幫助,歡迎來到Stack Overflow。如果此答案或任何其他人解決了您的問題,請將其標記爲已接受。 – ncardeli