JavaScript 中计数重复项和聚合对象数组
给定的问题要求计算数组元素的重复项,然后在一个新数组中聚合对象。
理解问题
问题陈述是要从数组中识别重复元素,并创建一个包含这些对象及其计数的单个数组。为了解决这个问题,我们将使用循环的帮助来使用蛮力技术。
什么是对象数组的聚合?
数组中的聚合是指将多个对象组合到一个新的输出数组中。我们必须检查对象的聚合是否与提到的数组的现有元素兼容且相等。
问题陈述可以通过以下给出的输出看到
输入
const details = [ { skill: 'Python', user: 'Preet' }, { skill: 'Javascript', user: 'Shreya' }, { skill: 'Javascript', user: 'Kajal' }, { skill: 'Java', user: 'Preet' }, { skill: 'Javascript', user: 'Preet' }, { skill: 'HTML and Css', user: 'Happy' } ];
输出
[ { "skill": "Python", "user": [ "Preet", "Happy" ] }, { "skill": "Javascript", "user": [ "Shreya", "Kajal", "Preet" ] }, { "skill": "Java", "user": [ "Preet" ] }, { "skill": "HTML and Css", "user": [ "Happy" ] } ]
算法
步骤 1:对象数组中给出的输入是重复数据和相同类型的混合,在我们的示例中,name 和 type 对象具有重复的值。因此,要将它们聚合到另一个数组中,并带有它们的计数值。为了解决这个问题,在其中给出了三个参数的函数声明,并将它们命名为 data、pCount(属性计数)和 pGroup(要分组的属性)。
步骤 2:声明一个计数变量来计算数据中对象值的出现次数。
步骤 3:现在我们定义多个循环来找出具有相同属性和值的属性。在我们的示例中,我们有两个对象,即 name 和 type。因此,我初始化了两个循环来分离属性并将它们放入不同的数组中,以及一个循环来计算相同类型的对象。
步骤 4:在通过所有条件后,将得到结果的新数组,我们可以看到包含所有多个数组及其不同数据值的输出。
示例
// Declaration of data const data = [ { name: 'Orange', type: 'fruit' }, { name: 'Orange', type: 'fruit' }, { name: 'Pineapple', type: 'fruit' }, { name: 'Pineapple', type: 'fruit' }, { name: 'Potato', type: 'vegetable' }, { name: 'Tomato', type: 'vegetable' }, { name: 'spinach', type: 'vegetable' }, { name: 'spinach', type: 'vegetable' } ]; // declaration of function with three arguments function countCollect(data, pCount, pGroup) { var count = {}; for (let obj of data) { let pValue = obj[pCount]; if (pValue in count) { count[pValue]++; } else { count[pValue] = 1; } } let result = {}; for (let obj of data) { let gValue = obj[pGroup]; if (gValue in result) { result[gValue].push(obj); } else { result[gValue] = [obj]; } } for (let pValue in count) { result[pValue] = { count: count[pValue] }; } return result; } let result = countCollect(data, 'name', 'type'); console.log(result);
输出
{ fruit: [ { name: 'Orange', type: 'fruit' }, { name: 'Orange', type: 'fruit' }, { name: 'Pineapple', type: 'fruit' }, { name: 'Pineapple', type: 'fruit' } ], vegetable: [ { name: 'Potato', type: 'vegetable' }, { name: 'Tomato', type: 'vegetable' }, { name: 'spinach', type: 'vegetable' }, { name: 'spinach', type: 'vegetable' } ], Orange: { count: 2 }, Pineapple: { count: 2 }, Potato: { count: 1 }, Tomato: { count: 1 }, spinach: { count: 2 } }
在上面的输出中,我们可以看到一个包含不同类型数据的数组。输出的初始块显示水果,输出的第二个块显示蔬菜及其名称和类型。输出的最后一个块显示水果和蔬菜的计数。
复杂度
执行此算法所需的时间为 n 平方时间的大 O。因为该算法使用两个循环来获取结果。空间复杂度将根据数组的长度计算,以将所有元素存储在内存中。因此,借助复杂度,我们可以分析问题的效率。
结论
正如我们所看到的,给定问题的简单性。要解决任何问题,我们需要遵循某些步骤并进行逻辑思考。时间复杂度和空间复杂度是衡量算法效率的两个指标。上述问题采用不同的方法来计算时间空间复杂度。