得多加強這部分的能力。
簡述
這是來自 Lidemy 第五期期中測驗 的題目。做完後發現我對「資料整理」的部分不夠熟,所以想記錄下來。
題目:
給你一筆資料:
1 2 3 4 5 6 7 8 9 10 11
| [ {id: 1, value: 43}, {id: 1, value: 213}, {id: 2, value: 321}, {id: 3, value: 2}, {id: 3, value: 345}, {id: 4, value: 555}, {id: 4, value: 44}, {id: 3, value: 33}, {id: 3, value: 199}, ]
|
請整理成這樣:
1 2 3 4 5 6
| [ {id: 1, value: [43, 213]}, {id: 2, value: 321}, {id: 3, value: [2, 345, 33, 199]}, {id: 4, value: [555, 44]} ]
|
簡單來說就是「把重複出現 id 的變成一個,而值要是 value 湊成的陣列(或單一值)」
附註:順序不可以改變,例如原本是 2 => 1 => 3 的話結果也要是先 2 => 1 => 3 這樣排。
思路
這題可以這樣子想:
- 先建立一個物件,把每個 id 出現的 value 給存起來
- 遍歷剛剛建好的物件,再整理成最後的格式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| function solve(arr) { const result = []; const valuesObject = retrieveValues(arr); for (let key in valuesObject) { if (valuesObject[key].length === 1) { result.push({ id: Number(key), value: valuesObject[key][0] }) } else { result.push({ id: Number(key), value: valuesObject[key] }) } } return result; } function retrieveValues(arr) {
const collection = {}; for (const item of arr) { if (' ' + item.id in collection) { collection[' ' + item.id].push(item.value) } else { collection[' ' + item.id] = [item.value] } } return collection }
|
我也不知道為什麼一開始沒有想到這種解法,可能我真的太久沒做題目了吧 QQ