JavaScript 统计重复项并聚合对象数组
给定的问题是要求计算数组元素的重复项,然后在一个新数组中聚合对象。
了解问题
问题陈述是要求从数组中识别重复的元素,并在一个数组中以对象的形式统计计数。为了解决这个问题,我们将使用for循环的蛮力技术。
什么是聚合对象数组
数组中的聚合指的是将多个对象合并为一个新数组作为输出。我们需要检查对象的聚合是否与数组中的现有元素兼容且相等。
问题陈述可以参考下面给出的输出:
输入
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: 声明一个 count 变量来计算数据中对象值的出现次数。
步骤 3: 现在我们定义多个 for 循环来找出具有相同值的属性。在我们的示例中,有两个对象,即 name 和 type。所以我初始化了两个 for 循环来分离属性并将它们放入不同的数组中,并用一个循环来计算相同类型的对象数量。
步骤 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 }
}
在上面的输出中,我们可以看到有一个包含不同类型数据的数组。输出的初始块显示了水果的信息,输出的第二个块显示了蔬菜的名称和类型。最后一个块显示了水果和蔬菜的计数。
复杂度
执行此算法所需的时间复杂度是O(n^2)。因为算法使用了两个循环来获取结果。空间复杂度将根据数组的长度计算,以便将所有元素存储在内存中。因此,通过复杂度我们可以分析问题的效率。
结论
正如我们所看到的,这个问题的解决方法很简单。为了解决任何问题,我们需要按照一定的步骤并进行逻辑思考。时间复杂度和空间复杂度是算法效率的两个衡量标准。上述问题采用了不同的方法来计算时间和空间复杂度。