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个对象的数组。
结论
通过上述问题的逻辑,我们可以看到解决任何问题都需要遵循一定的步骤和逻辑思维。时间复杂度和空间复杂度是算法效率的两个度量。上述算法的时间和空间复杂度相同。