我有一個看起來像這樣的物件:
{ role1: ["id1", "id2", "id3"], role2: ["id1", "id2"], role3: ["id2", "id4"] }
我想將其轉換為物件陣列,使 ids 成為唯一識別符號,并將角色轉換為陣列,如下所示:
[
{ id: "id1", roles: ["role1", "role2"] },
{ id: "id2", roles: ["role1", "role2", "role3"] },
{ id: "id3", roles: ["role1"] },
{ id: "id4", roles: ["role3"] },
]
我現在就是這樣做的,但我不確定是否有更好的方法。感覺好像我把事情復雜化了。
const obj = {
role1: ["id1", "id2", "id3"],
role2: ["id1", "id2"],
role3: ["id2", "id4"]
};
const users = [];
Object.entries(obj).forEach(([key, ids]) => {
ids.forEach(id => {
const user = users.find(x => x.id === id);
if (user) {
user.roles.push(key);
return;
}
users.push({
id,
roles: [key]
});
});
});
console.log(users);
uj5u.com熱心網友回復:
您可能只需將其轉換為如下物件:
const obj = {
role1: ["id1", "id2", "id3"],
role2: ["id1", "id2"],
role3: ["id2", "id4"]
};
let userDict = {};
Object.entries(obj).forEach(([key, ids]) => {
ids.forEach(id => {
userDict[id] = (userDict[id] || []);
userDict[id].push(key);
});
});
let users = Object.entries(userDict).map(([id, roles]) => ({ id, roles }));
console.log(users);
.as-console-wrapper { max-height: 100% !important; top: auto; }
甚至reduce像這樣使用:
顯示代碼片段
const obj = {
role1: ["id1", "id2", "id3"],
role2: ["id1", "id2"],
role3: ["id2", "id4"]
};
let userDict = Object.entries(obj).reduce((acc, [role, ids]) => {
ids.forEach(id => {
acc[id] = (acc[id] || []);
acc[id].push(role);
});
return acc;
}, {});
let users = Object.entries(userDict).map(([id, roles]) => ({ id, roles }));
console.log(users);
.as-console-wrapper { max-height: 100% !important; top: auto; }
任何一個選項都比一直使用陣列更簡潔和簡單。
uj5u.com熱心網友回復:
首先,我通過使用Set(以避免重復)和flat從該物件中獲取所有 id
const obj = {
role1: ["id1", "id2", "id3"],
role2: ["id1", "id2"],
role3: ["id2", "id4"],
};
const objsId = [
...new Set(
Object.values(obj) //[["id1","id2","id3"],["id1","id2"],["id2","id4"]]
.flat() //['id1', 'id2', 'id3', 'id1', 'id2', 'id2', 'id4']
),
];
console.log(objsId); //['id1', 'id2', 'id3', 'id4']
第二件事是通過使用從該陣列創建一個物件Object.fromEntries
方法將鍵值對串列轉換為物件。
const objsId = ['id1', 'id2', 'id3', 'id4'];
const idRoles = Object.fromEntries(
objsId.map((id) => [id, []]) //[["id1",[]],["id2",[]],["id3",[]],["id4",[]]]
);
console.log(idRoles) //{"id1":[],"id2":[],"id3":[],"id4":[]}
最后回圈遍歷我們的陣列 objsId和每個 id,使用Object.fromEntries()
和for..of回圈遍歷您的物件 obj條目
如果當前 id 存在于角色中,那么將影響該角色添加到idRoles
const obj = {
role1: ["id1", "id2", "id3"],
role2: ["id1", "id2"],
role3: ["id2", "id4"],
};
const objsId = ['id1', 'id2', 'id3', 'id4'];
const idRoles = { id1: [], id2: [], id3: [], id4: [] };
for (const id of objsId) {
for (const [role, ids] of Object.entries(obj)) {
if (ids.includes(id)) idRoles[id].push(role);
}
}
console.log(idRoles);
顯示代碼片段
const obj = {
role1: ["id1", "id2", "id3"],
role2: ["id1", "id2"],
role3: ["id2", "id4"],
};
const objsId = [
...new Set(
Object.values(obj) //[["id1","id2","id3"],["id1","id2"],["id2","id4"]]
.flat() //['id1', 'id2', 'id3', 'id1', 'id2', 'id2', 'id4']
),
]; //['id1', 'id2', 'id3', 'id4']
const idRoles = Object.fromEntries(
objsId.map((id) => [id, []]) //[["id1",[]],["id2",[]],["id3",[]],["id4",[]]]
); //{"id1":[],"id2":[],"id3":[],"id4":[]}
for (const id of objsId) {
for (const [role, ids] of Object.entries(obj)) {
if (ids.includes(id)) idRoles[id].push(role);
}
}
const result = [];
for (let [id, roles] of Object.entries(idRoles)) {
result.push({ id, roles });
}
console.log(JSON.stringify(result, null, 4));
uj5u.com熱心網友回復:
只是 Lodash 庫的另一個版本
const obj = {
role1: ["id1", "id2", "id3"],
role2: ["id1", "id2"],
role3: ["id2", "id4"]
};
const users = _.chain(obj)
.entries()
.reduce((accm, [role, ids]) => {
ids.forEach((id) => (accm[id] || (accm[id] = [])).push(role));
return accm;
}, {})
.entries()
.map(([id, roles]) => ({ id, roles }));
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/488750.html
標籤:javascript 数组 目的 合并
