JavaScript 通过Array对象列表来操作对象进行分组

JavaScript 通过Array对象列表来操作对象进行分组

给定的问题是使用JavaScript操作对象,根据输出的数组对象列表进行分组。

理解问题

在开始编写给定问题的算法和程序之前,我们先了解问题背后的逻辑。

考虑一组对象,每个对象代表一个人并包含有关该个人的详细信息,例如姓名、年龄和职业。我们需要根据职业将人员进行分组。例如,我们希望构建一个对象,其中每个属性都表示一种职业,其值是具有该职业的对象的数组。

通过根据特定特征将对象分组,我们可以简单地对共享相同特征的项目子集进行操作。这是一种常见的JavaScript操作,特别是在处理包含具有不同属性的对象的数据集时。

算法 – 使用forEach()

步骤1: :创建一个名为”grouped “的空对象。

步骤2: :遍历数组中的对象。

步骤3: :对于每个对象,确定名为”grouped “的对象是否包含与对象的组名匹配的属性。

步骤4: :如果属性存在,则将其添加到该特定组的对象数组中。

步骤5: :如果属性不存在,则创建一个包含当前对象的数组,并将其值设置为”grouped “属性的值,组名为对象的组名。

步骤6: :在最后一步将输出显示为”grouped “。

示例

//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个对象的数组。

结论

通过上述问题的逻辑,我们可以看到解决任何问题都需要遵循一定的步骤和逻辑思维。时间复杂度和空间复杂度是算法效率的两个度量。上述算法的时间和空间复杂度相同。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程