使用 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 個物件的物件陣列。
結論
我們已經看到了給定問題的邏輯。要解決任何問題,都需要遵循某些步驟並進行邏輯思考。時間複雜度和空間複雜度是衡量演算法效率的兩個指標。上述演算法具有相同的時間和空間複雜度。
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP