使用 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 次查看

开启您的职业生涯

完成课程获得认证

开始学习
广告