在 JavaScript 中计算重复项并聚合对象数组

javascriptweb developmentfront end technologyobject oriented programming

给定的问题是说明计算数组元素的重复项,然后在新数组中聚合对象。

理解问题

问题陈述是说明从数组中识别重复元素并创建一个包含这些对象的数组,说明计数。为了解决这个问题,我们将在 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:对象数组中给出的输入是重复数据和相同类型的混合,在我们的示例中,名称和类型对象具有重复值。因此,将它们与计数值一起聚合到不同的数组中。为了解决这个问题,声明带有三个参数的函数,并将它们命名为数据、pCount(属性计数)、pGroup(属性分组)。

步骤 2:声明一个计数变量来计算数据中对象值的出现次数。

步骤 3:现在我们定义多个 for 循环来找出相同的属性及其值。在我们的示例中,我们有 2 个对象,即名称和类型。因此我初始化了两个 for 循环来分离属性并将它们放在不同的数组中,并初始化了一个循环来计算相同类型的对象。

步骤 4:在满足所有条件后,将出现新的结果数组,我们可以可视化输出,其中包含具有不同数据值的所有多个数组。

示例

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

结论

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


相关文章