JavaScript 中合并子数组
此问题要求使用 JavaScript 概念合并子数组。我们将在此问题中使用电子邮件数据。此外,我们将合并具有相同名称的人员的电子邮件。
理解问题
为了解决任何给定的陈述,我们首先需要深入理解问题。这个问题将被分解成子问题。因此,解决这个问题将变得容易。考虑解决问题必须遵循的任何重要程序或步骤。
为了解决这个问题,我们必须根据其匹配的名称组织电子邮件地址。这可以通过迭代输入数组并在使用映射来保存每个名称的电子邮件地址的同时来完成。
算法
步骤 1 − 声明一个名为 mergeSubArray 的函数,该函数将数组元素作为输入。此函数将在返回新数组之前对数组中所有人员的电子邮件地址进行分组。
步骤 2 − 声明最终的 emailData 数组,其中输入数组中存在的元素的所有组具有不同的组合。目前,将其声明为一个空数组。'Set' 将在此阶段用于存储电子邮件地址,因为它消除了重复数据
步骤 3 − 循环遍历输入数组中的每个元素。在此阶段,将删除当前元素中人员的姓名和电子邮件。如果它不是当前名称的一个,则创建一个包含电子邮件的新批次并将其添加到 emailData 中。
步骤 4 − 将每个电子邮件地址添加到现在位于 emailData 中的名称的 Set 中。
步骤 5 − 循环遍历 emailData 后,将创建一个名为 showResult 的新数组,它将包含已排序的电子邮件地址。
步骤 6 − 因此,我们已根据其名称对电子邮件进行了排序,并将结果放入结果数组中
步骤 7 − 这就是子数组的分组和合并以提供结果数组的方式。
示例
//create an array with name and email
const arr = [ ["Ayaan", "ayaanshri@email.com", "ayaan00@email.com"],
["Maahi", "maahibhatt@email.com"],
["Ayaan", "ayaansss@email.com", "ayaan_nepal@email.com"],
["Maahi", "maahi@email.com"]
];
//define function mergeSubArray
function mergeSubArray(arr) {
const emailData = {};
for (let i = 0; i < arr.length; i++) {
const name = arr[i][0];
const mail = arr[i].slice(1);
if (!emailData.hasOwnProperty(name)) {
emailData[name] = new Set(mail);
} else {
mail.forEach(email => emailData[name].add(email));
}
}
const showResult = [];
for (const [name, mail] of Object.entries(emailData)) {
showResult.push([name, ...[...mail].sort()]);
}
return showResult;
}
console.log(mergeSubArray(arr));
输出
[
[
'Ayaan',
'ayaan00@email.com',
'ayaan_nepal@email.com',
'ayaanshri@email.com',
'ayaansss@email.com'
],
[ 'Maahi', 'maahi@email.com', 'maahibhatt@email.com' ]
]
时间和空间复杂度
mergeSubArray() 函数具有 O(n log n) 的时间复杂度,其中 n 表示输入数组中电子邮件的总数。这是因为该函数对电子邮件地址进行排序并使用 Set 来检查重复项,这两者都具有 O(n log n) 的最坏情况时间复杂度。在最坏情况下,循环遍历 emailData 具有 O(n) 的时间复杂度,其中 n 是输入数组中不同名称的总数。
该函数的空间复杂度为 O(n),其中 n 是输入数组中电子邮件的总数。这是因为函数创建的哈希表可以为输入数组中的每个唯一名称创建一个条目。哈希表中的每个条目都包含一个最多包含 n 个电子邮件地址的 Set。
结论
我们通过使用映射来存储每个名称的所有电子邮件地址来做到这一点。后续过程的时间复杂度和空间复杂度由输入数组中电子邮件的总数(用整数 n 表示)决定。
数据结构
网络
RDBMS
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP