使用 JavaScript 根據陣列物件列表對物件進行分組
給定的問題說明了如何使用 JavaScript 根據輸出陣列物件列表對物件進行分組。
理解問題
在開始為給定問題編寫演算法和程式之前,我們將首先理解該問題背後的邏輯。
考慮一組物件,每個物件代表一個人,幷包含有關該個人的詳細資訊,例如姓名、年齡和職業。我們需要建立一個按相同職業分組的人員組。例如,我們希望建立一個物件,其屬性分別表示一個職業,其值是具有該職業的物件陣列。
透過根據特定特徵對物件進行分組,我們可以輕鬆地對共享共同特徵的專案的子集進行操作。這是典型的 JavaScript 操作,尤其是在處理包含具有各種屬性的物件的資料集時。
演算法 - 使用 forEach()
步驟 1:建立一個名為“grouped”的空物件。
步驟 2:迭代陣列中的物件。
步驟 3:對於每個物件,檢查“grouped”物件是否包含與該物件的組名稱匹配的屬性。
步驟 4:如果屬性存在,則將該物件新增到該特定組的物件陣列中。
步驟 5:如果屬性不存在,則建立一個包含當前物件的陣列,並將其值設定為“grouped”屬性中具有組名稱的屬性的值。
步驟 6:最後一步顯示分組後的結果。
示例
//Define array of objects const persons = [ { person: 'Alka', profession: 'Choreographer', age: 25 }, { person: 'Bittu', profession: 'Developer', age: 22 }, { person: 'Chetana', profession: 'Teacher', age: 30 }, { person: 'Rina', profession: 'Cricketer', age: 35 }, { person: 'Sanchi', profession: 'Engineer', age: 23 }, { person: 'Farhad', profession: 'Businessman', age: 28 }, ]; //method groupAndObjects with arguments function groupAndObjects(array, prop) { const grouped = {}; array.forEach((obj) => { const gName = obj[prop]; if (grouped[gName]) { grouped[gName].push(obj); } else { grouped[gName] = [obj]; } }); return grouped; } const group = groupAndObjects(persons, "person"); console.log(group);
輸出
{ Alka: [ { person: 'Alka', profession: 'Choreographer', age: 25 } ], Bittu: [ { person: 'Bittu', profession: 'Developer', age: 22 } ], Chetana: [ { person: 'Chetana', profession: 'Teacher', age: 30 } ], Rina: [ { person: 'Rina', profession: 'Cricketer', age: 35 } ], Sanchi: [ { person: 'Sanchi', profession: 'Engineer', age: 23 } ], Farhad: [ { person: 'Farhad', profession: 'Businessman', age: 28 } ] }
演算法 - 使用 reduce()
步驟 1:建立一個名為“items”的物件樣本陣列。
步驟 2:建立一個 groupedItems 使用 reduce 方法累積每個陣列物件。
步驟 3:檢查 if-else 條件以驗證即將到來的對是否與該類別匹配。
步驟 4:如果它與陣列中的類別匹配,則將其推入。
步驟 6:最後一步顯示 groupedItems 結果。
示例
// sample array of objects const items = [ { name: 'apple', category: 'fruit' }, { name: 'banana', category: 'fruit' }, { name: 'carrot', category: 'vegetable' }, { name: 'orange', category: 'fruit' }, { name: 'spinach', category: 'vegetable' } ]; // group items by category using reduce const groupedItems = items.reduce((acc, item) => { if (!acc[item.category]) { acc[item.category] = []; } acc[item.category].push(item); return acc; }, {}); // print the grouped items console.log(groupedItems);
輸出
{ fruit: [ { name: 'apple', category: 'fruit' }, { name: 'banana', category: 'fruit' }, { name: 'orange', category: 'fruit' } ], vegetable: [ { name: 'carrot', category: 'vegetable' }, { name: 'spinach', category: 'vegetable' } ] }
複雜度
根據上述演算法,我們的時間複雜度為 O(n)。在這個時間複雜度中,n 表示陣列中的物件數量。產生這種複雜度的原因是程式只迭代陣列中存在的每個物件一次。與時間複雜度一樣,該演算法的空間複雜度也相同,為 O(n),因為我們知道分組後的物件將包含 n 個屬性,每個屬性都包含一個總共 n 個物件的物件陣列。
結論
我們已經看到了給定問題的邏輯。要解決任何問題,都需要遵循某些步驟並進行邏輯思考。時間複雜度和空間複雜度是衡量演算法效率的兩個指標。上述演算法具有相同的時間和空間複雜度。