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。因为该算法使用两个循环来获取结果。空间复杂度将根据数组的长度计算,以将所有元素存储在内存中。因此,借助复杂度,我们可以分析问题的效率。
结论
正如我们所看到的,给定问题的简单性。要解决任何问题,我们需要遵循某些步骤并进行逻辑思考。时间复杂度和空间复杂度是衡量算法效率的两个指标。上述问题采用不同的方法来计算时间空间复杂度。
数据结构
网络
关系型数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP