[英]How do I group values present under a key in all objects in an array of JSON, under a single key?
我有一個 JSON 數組,例如:
[
{user_id:1, name: "Person A", project: "Project A"},
{user_id:1, name: "Person A", project: "Project B"},
{user_id:2, name: "Person B", project: "Project A"},
{user_id:2, name: "Person B", project: "Project C"},
{user_id:3, name: "Person C", project: "Project D"}
]
我想轉換這個數組,使得一個人只有一個條目,並且它有一個值為active_projects的數組,或者他所有的項目。 基本上我想刪除這個數組中的冗余。 output 將是:
[
{user_id:1, name: "Person A", active_projects: ["Project A","Project B"] },
{user_id:2, name: "Person B", active_projects: ["Project A","Project C"] },
{user_id:3, name: "Person C", active_projects: ["Project D"] }
]
什么是最干凈和最好的方法?
一個簡單的解決方案是首先使用reduce
計算 user_ids 的 map。 然后只需使用Object.values
將其轉換為數組。
const lkp = data.reduce((acc, {user_id, name, project}) => { acc[user_id] = acc[user_id] || {}; acc[user_id].user_id = user_id; acc[user_id][name] = name; acc[user_id].active_projects = acc[user_id].active_projects || []; acc[user_id].active_projects.push(project); return acc; }, {}) const arr = Object.values(lkp) console.log(arr)
<script> var data = [ {user_id:1, name: "Person A", project: "Project A"}, {user_id:1, name: "Person A", project: "Project B"}, {user_id:2, name: "Person B", project: "Project A"}, {user_id:2, name: "Person B", project: "Project C"}, {user_id:3, name: "Person C", project: "Project D"} ]; </script>
您可以嘗試reduce
JavaScript 的方法。
var data =[ {user_id:1, name: "Person A", project: "Project A"}, {user_id:1, name: "Person A", project: "Project B"}, {user_id:2, name: "Person B", project: "Project A"}, {user_id:2, name: "Person B", project: "Project C"}, {user_id:3, name: "Person C", project: "Project D"}]; result = Object.values(data.reduce((acc, {user_id, project, ...rest})=>{ acc[user_id] = acc[user_id] || { user_id, ...rest }; acc[user_id].activeProject = acc[user_id].activeProject || []; acc[user_id].activeProject.push(project); return acc; },{})); console.log(result);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.