一直在研究一個資料格式的問題,終于得到了答案。
但是,我的答案有太多的回圈,并且在實施時會減慢時間復雜度。
下面是我的代碼:
const userInfo = [];
for (let i = 0; i < projects.length; i ) {
const userProject = projects[i].userProjects;
for (let j = 0; j < userProject.length; j ) {
const userExist = userInfo.some((item) =>
item.userId.includes(userProject[j].user.userId)
);
if (!userExist) userInfo.push(userProject[j].user);
}
}
userInfo.forEach((user) => {
let tempArr = [];
for (let i = 0; i < projects.length; i ) {
const userProject = projects[i].userProjects;
for (let j = 0; j < userProject.length; j ) {
if (user.userId === userProject[j].userId)
tempArr.push({
projectId: projects[i].projectId,
name: projects[i].name,
});
}
}
user.project = tempArr;
});
console.log(userInfo);
有沒有辦法優化我的代碼?我試圖將嵌套的 for 回圈組合在一起但不起作用...
請幫忙。非常感謝!!!
uj5u.com熱心網友回復:
在頂部,外部的兩個回圈看起來是必要的(因為您有 N 個專案 * M 個 userProjects),但第三個回圈.some不是 - 將userInfo陣列從陣列更改為 userIds 到用戶的映射,因此在第二個回圈中,您只需要查看 userId 是否已經存在 ( O(1)),如果不存在則分配。
不是分配用戶,而是在最后分配一個您需要的形狀的物件 - a [{ projectId, name }]。這將節省您不必再經過整個陣列-一旦你檢查,看看是否需要建立對周邊陣列userId,你可以把物件的陣列,你是否沒有創建陣列在那個迭代與否。
const userProjectsByUserId = new Map();
for (const { userProjects, projectId, name } of projects) {
for (const { user } of projects) {
if (!userProjectsByUserId.has(user.userId)) {
userProjectsByUserId.set(user.userId, { user, projects: [] }]);
}
userProjectsByUserId.get(user.userId).projects.push({ projectId, name });
}
}
這會給你一個形狀的地圖
userId => {
user,
projects: [
{ projectId, name },
...
如果您需要當前代碼為您提供的確切資料結構,然后執行以下操作:
const output = [...userProjectsByUserId.values()]
.map(({ user, projects }) => ({ ...user, project: projects }));
(盡管您可能會考慮使用projects而不是project,因為它是一個專案的集合,而不是單個專案)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/374256.html
標籤:javascript for循环 数据结构
