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。因为该算法使用两个循环来获取结果。空间复杂度将根据数组的长度计算,以将所有元素存储在内存中。因此,借助复杂度,我们可以分析问题的效率。

结论

正如我们所看到的,给定问题的简单性。要解决任何问题,我们需要遵循某些步骤并进行逻辑思考。时间复杂度和空间复杂度是衡量算法效率的两个指标。上述问题采用不同的方法来计算时间空间复杂度。

更新于: 2023年8月18日

2K+ 阅读量

开启你的 职业生涯

通过完成课程获得认证

立即开始
广告