使用 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 个对象的对象数组。
结论
我们已经看到了给定问题的逻辑。要解决任何问题,都需要遵循某些步骤并进行逻辑思考。时间复杂度和空间复杂度是衡量算法效率的两个指标。上述算法具有相同的时间和空间复杂度。