使用 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