在 JavaScript 中对数组进行排序,并将所有相同的(重复的)数字分组到它们各自的子数组中


在这个问题中,我们必须通过创建它们的子数组来对数组中的所有重复数据进行分组。创建子数组后,我们必须按排序顺序排列它们。这个问题可以通过数据结构的搜索技术来解决。

理解问题

因此,为了解决这个问题,我们将以两种方式使用 javascript 的 reduce() 方法。reduce 方法是一种迭代方法,它使用 reducer 函数迭代数组中的所有项目。

因此,通过逐一检查,我们将跟踪所有元素并将它们保存在一个单独的变量中,并在迭代数组中的所有元素后对它们进行分组。

算法 - 第一种方法

步骤 1:在此步骤中定义所有必要的变量。在我们的例子中,我们创建了一个名为“arrayData”的数组。

步骤 2:现在,为了迭代数组的所有项目,我们将使用 javascript 的 reduce 函数并使用两个指针来获取每个项目的 position。这些指针分别命名为 prevItem 和 currentItem。如果 prevItem 与 currentItem 相同,则将它们添加到子数组中,否则添加到新数组中。

步骤 3:现在将所有值以对象的形式放入,并将新创建的数组分配给 sameObjToArray 变量。

步骤 4:对所有重复元素进行分组后,返回结果并使用控制台显示输出。

示例

//Define array of duplicate elements in it
const arrayData = [2,3,8,9,2,3,5,4,8,9,2,3,7,5];

//define a variable to check same items
const sameObj = arrayData.reduce(
   (prevItem, currentItem) => ({
     ...prevItem,
     [currentItem]: [...(prevItem[currentItem] || []), currentItem],
   }),
   {}
  );
  
const sameObjToArray = Object.values(sameObj);

// console the output
console.log("After grouping identical elements");
console.log(sameObjToArray);

输出

After grouping identical elements
[ [ 2, 2, 2 ], [ 3, 3, 3 ], [ 4 ], [ 5, 5 ], [ 7 ], [ 8, 8 ], [ 9, 9 ] ]

算法 - 第二种方法

步骤 1:在给定的问题中,我们将检查数组的重复元素并在单个数组中对它们进行分组,因此为了实现此问题陈述,我们将遵循一些准则。首先,我们将创建一个函数来检查相同的元素并将数组作为参数传递。

步骤 2:如果提供的数组尚未排序,则必须首先使用 sort() 方法对其进行排序。在此步骤中,我们将提供的数组按升序排序。放置顺序后,分组将变得简单,然后您可以将项目放入新数组中。

步骤 3:如前几个步骤中所述,数组现在已排序。为了构建子数组,我们需要原始数组组件的空数组。并因此赋予其名称。

步骤 4:在步骤 1、2 和 3 之后,下一步是迭代输入数组的所有元素,因此我们将使用数组的长度初始化一个 for 循环。

步骤 5:在 for 循环中,检查元素的值,如果它们相同,则将其推入同一个子数组中。否则将其推入新子数组中。

步骤 6:在此步骤中,声明我们必须在上述函数中传递的输入数组数据。

步骤 7:在最后一步中,声明另一个变量以调用上述函数并在其中传递一个声明的数组。并打印结果,在控制台中输出结果。

示例

// define a function to check duplicate numbers
function groupDuplicateNumbers(array) {
  array.sort((a, b) => a - b); 

  // declare empty array
  const result = [[]]; 

 // initialize a for loop to iterate all the elements
  for (let i = 0; i < array.length; i++) {
   // if-else condition to check elements are same
   if (array[i] === array[i-1]) {
     result[result.length - 1].push(array[i]); 
   } else {
     result.push([array[i]]); 
   }
  }

  return result.slice(1); 
}

//define array and call function
const array =  [151,221,330,151,221,330,414,202,202,414];
const finalGroup = groupDuplicateNumbers(array); 
console.log("The group of identical items in array:")
console.log(finalGroup); 

输出

The group of identical items in array:
[
  [ 151, 151 ],
  [ 202, 202 ],
  [ 221, 221 ],
  [ 330, 330 ],
  [ 414, 414 ]
]

复杂度

要计算复杂度,我们必须检查数组大小和函数。因此,在我们的程序中,我们使用了一个包含 n 个元素的数组,并且有一个 sameObj 函数,它正在迭代所有项目并检查它们的出现次数。在检查重复项后,我们将其放入子数组中以创建子数组的新数组组合。因此,基本上,此程序完成执行所需的时间为 O(n),因为数组包含 n 个元素。

结论

因此,在解决此问题后,我们学习了如何删除或分离数组的重复元素。因此,此方法将减少数据的冗余,并减少保存数据的内存空间。最后,我们得出结论,此算法的时间复杂度为 O(n)。

更新于: 2023年8月18日

1K+ 阅读量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.