我一直在努力重組這個特定的物件;
[
{
"userId": 1,
"name": "Breaker of Sky",
"rank": 1
},
{
"userId": 1,
"name": "Slayer of Mountain",
"rank": 2
},
{
"userId": 1,
"name": "Balthromaw",
"rank": 3
},
{
"userId": 1,
"name": "Death",
"rank": -1
},
{
"userId": 3,
"name": "Breaker of Sky",
"rank": 2
},
{
"userId": 3,
"name": "Slayer of Mountain",
"rank": 3
},
{
"userId": 3,
"name": "Balthromaw",
"rank": 1
},
{
"userId": 3,
"name": "Death",
"rank": -1
},
{
"userId": 4,
"name": "Breaker of Sky",
"rank": 3
},
{
"userId": 4,
"name": "Slayer of Mountain",
"rank": 2
},
{
"userId": 4,
"name": "Balthromaw",
"rank": 1
},
{
"userId": 4,
"name": "Death",
"rank": -1
},
{
"userId": 8,
"name": "Breaker of Sky",
"rank": 2
},
{
"userId": 8,
"name": "Slayer of Mountain",
"rank": 3
},
{
"userId": 8,
"name": "Balthromaw",
"rank": 4
},
{
"userId": 8,
"name": "Death",
"rank": 1
}
]
使它看起來像下面的這個物件。
[
{ ranking: [['Death'], ['Breaker of Sky'], ['Slayer of Mountain'], ['Balthromaw']], count: 2 },
{ ranking: [['Death'], ['Balthromaw'], ['Breaker of Sky'], ['Slayer of Mountain']], count: 1 },
{ ranking: [['Death'], ['Balthromaw'], ['Slayer of Mountain'], ['Breaker of Sky']], count: 1 },
]
為了簡單地解釋這個程序,我們首先需要查找 userId 并將具有相同 userId 的等級的名稱分組。然后它應該通過查看他們的排名來排列名稱(-1 將始終排在第一位)。之后,我們應該尋找序列,計數并記錄下來。例如,此序列[['Death'], ['Breaker of Sky'], ['Slayer of Mountain'], ['Balthromaw']]已被發現 2 次,因此計數為 2。
我很感激你對這個問題的幫助。
我的代碼:
這是我到目前為止所做的。它仍然缺少通過對排名進行排序來排列部分名稱,并且排名屬性的值也不是陣列。此外,我也無法計算序列部分。你能幫我解決嗎?
const merged = data.reduce((r, { userId, ...rest }) => {
const key = `${userId}`;
r[key] = r[key] || { ranking: [] };
r[key]['ranking'].push(rest);
return r;
}, {});
const rankArray = Object.values(merged);
console.log(rankArray);
我得到的輸出:
[
{
"ranking": [
{
"name": "Breaker of Sky",
"rank": 1
},
{
"name": "Slayer of Mountain",
"rank": 2
},
{
"name": "Balthromaw",
"rank": 3
},
{
"name": "Death",
"rank": -1
}
]
},
{
"ranking": [
{
"name": "Breaker of Sky",
"rank": 2
},
{
"name": "Slayer of Mountain",
"rank": 3
},
{
"name": "Balthromaw",
"rank": 1
},
{
"name": "Death",
"rank": -1
}
]
},
{
"ranking": [
{
"name": "Breaker of Sky",
"rank": 3
},
{
"name": "Slayer of Mountain",
"rank": 2
},
{
"name": "Balthromaw",
"rank": 1
},
{
"name": "Death",
"rank": -1
}
]
},
{
"ranking": [
{
"name": "Breaker of Sky",
"rank": 2
},
{
"name": "Slayer of Mountain",
"rank": 3
},
{
"name": "Balthromaw",
"rank": 4
},
{
"name": "Death",
"rank": 1
}
]
}
]
uj5u.com熱心網友回復:
有幾個步驟要做:
- Group by
userId,您已經完成了。 - 按 對每個用戶的值進行排序
rank。 - 為每個排名專案陣列構建一個計數圖。我假設排名數字無關緊要,只有字串名稱。
- 修剪
count > 1地圖中的任何額外元素。(我認為這是您想要的邏輯;如果不是,您可以洗掉該delete byUser[userId]行) - 迭代并將最終計數附加到結果陣列中的每個物件。
這是所有這些的一種方法:
const data = [ { "userId": 1, "name": "Breaker of Sky", "rank": 1 }, { "userId": 1, "name": "Slayer of Mountain", "rank": 2 }, { "userId": 1, "name": "Balthromaw", "rank": 3 }, { "userId": 1, "name": "Death", "rank": -1 }, { "userId": 3, "name": "Breaker of Sky", "rank": 2 }, { "userId": 3, "name": "Slayer of Mountain", "rank": 3 }, { "userId": 3, "name": "Balthromaw", "rank": 1 }, { "userId": 3, "name": "Death", "rank": -1 }, { "userId": 4, "name": "Breaker of Sky", "rank": 3 }, { "userId": 4, "name": "Slayer of Mountain", "rank": 2 }, { "userId": 4, "name": "Balthromaw", "rank": 1 }, { "userId": 4, "name": "Death", "rank": -1 }, { "userId": 8, "name": "Breaker of Sky", "rank": 2 }, { "userId": 8, "name": "Slayer of Mountain", "rank": 3 }, { "userId": 8, "name": "Balthromaw", "rank": 4 }, { "userId": 8, "name": "Death", "rank": 1 } ];
const byUser = data.reduce((a, e) => {
a[e.userId] = a[e.userId] || [];
a[e.userId].push(e);
return a;
}, {});
const counts = {};
for (const [userId, ranking] of Object.entries(byUser)) {
ranking.sort((a, b) => a.rank - b.rank);
byUser[userId] = ranking.map(e => e.name);
const k = byUser[userId];
counts[k] = counts[k] || 1;
if (counts[k] > 1) {
delete byUser[userId];
}
}
const result = Object.values(byUser).map(v => ({
ranking: v,
count: counts[v],
}));
console.log(result);
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/404636.html
標籤:
上一篇:如何識別Json語法以獲取值
