使用 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 個物件的物件陣列。

結論

我們已經看到了給定問題的邏輯。要解決任何問題,都需要遵循某些步驟並進行邏輯思考。時間複雜度和空間複雜度是衡量演算法效率的兩個指標。上述演算法具有相同的時間和空間複雜度。

更新於:2023年8月23日

199 次檢視

開啟您的職業生涯

完成課程獲得認證

開始學習
廣告