
本教程旨在解决javascript中从对象数组中移除重复键值对的问题。我们将通过一种高效的算法,利用一个跟踪已出现键值对的辅助数据结构(seen映射),结合array.prototype.reduce方法,遍历输入数组并构建新的对象,确保每个输出对象仅包含在此之前未曾出现的键值对。文章将提供详细的算法解析、typescript实现代码及使用示例,帮助开发者清晰地理解和应用此技术。
在处理复杂数据结构时,我们经常需要对数据进行清洗和去重。一个常见的场景是,给定一个包含多个对象的数组,我们希望从这些对象中移除那些键值对(key-value pair)在之前对象中已经出现过的部分,从而得到一个仅包含独特键值对的新对象数组。
假设我们有一个对象数组,其中每个对象都包含一组键值对。我们的目标是创建一个新的对象数组,其中每个对象仅包含那些在整个处理过程中首次出现的键值对。如果一个键值对(例如 Param1: "20")已经在之前的对象中出现过,那么它在后续对象中的相同出现将被忽略。
示例输入:
const arr1 = [
{
"Param1": "20",
"Param2": "8",
"Param3": "11",
"Param4": "4",
"Param5": "18",
"Param6": "20",
"Param7": "8"
},
{
"Param6": "21",
"Param7": "8",
"Param8": "11",
"Param9": "4",
"Param10": "18"
},
{
"Param1": "20",
"Param2": "8",
"Param3": "10"
}
];期望输出:
立即学习“Java免费学习笔记(深入)”;
本文档主要讲述的是j2me3D游戏开发简单教程; 如今,3D图形几乎是任何一部游戏的关键部分,甚至一些应用程序也通过用3D形式来描述信息而获得了成功。如前文中所述,以立即模式和手工编码建立所有的3D对象的方式进行开发速度很慢且很复杂。应用程序中多边形的所有角点必须在数组中独立编码。在JSR 184中,这称为立即模式。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
0
[
{
"Param1": "20",
"Param2": "8",
"Param3": "11",
"Param4": "4",
"Param5": "18",
"Param6": "20",
"Param7": "8"
},
{
"Param6": "21", // 注意:Param6: "20" 已出现,但 Param6: "21" 是新的
"Param8": "11",
"Param9": "4",
"Param10": "18"
},
{
"Param3": "10" // 注意:Param1: "20", Param2: "8" 已出现,但 Param3: "10" 是新的
}
]解决此问题的核心思想是维护一个“已见”状态,记录所有已经处理过的键值对。当遍历数组中的每个对象及其键值对时,我们检查当前键值对是否已在“已见”状态中。
我们可以使用 Array.prototype.reduce 方法来优雅地实现上述算法。reduce 允许我们维护一个累加器,其中可以包含 seen 映射和 result 数组。
type KeyValueMap = Record<string, string>;
type SeenMap = Record<string, Record<string, boolean>>;
/**
* 从对象数组中移除重复的键值对。
* 如果一个键值对(key:value)在之前的对象中已经出现过,则在后续对象中忽略它。
*
* @param arr 输入的对象数组,每个对象包含字符串键和字符串值。
* @returns 包含唯一键值对的新对象数组。
*/
const removeDuplicates = (arr: KeyValueMap[]): KeyValueMap[] => {
// 使用 reduce 方法来迭代数组并维护一个累加器
return arr.reduce<{
seen: SeenMap; // 存储已出现的键值对
result: KeyValueMap[]; // 存储最终结果
}>(
(acc, currentItem) => {
// 为当前对象创建一个新的对象,只包含唯一的键值对
const uniqueItem = Object.fromEntries(
// 遍历当前对象的所有键值对
Object.entries(currentItem).filter(([key, value]) => {
// 确保 seen[key] 存在,如果不存在则初始化为空对象
acc.seen[key] = acc.seen[key] ?? {};
// 检查当前键值对是否已在 seen 中
if (acc.seen[key][value]) {
// 如果已存在,则过滤掉此键值对
return false;
}
// 如果是首次出现,则标记为已见
acc.seen[key][value] = true;
// 并保留此键值对
return true;
}),
);
// 将处理后的唯一对象添加到结果数组中
acc.result.push(uniqueItem);
return acc;
},
{ seen: {}, result: [] }, // reduce 的初始累加器值
).result; // 最后返回累加器中的 result 数组
};
// 示例用法
const arr1 = [
{
"Param1": "20",
"Param2": "8",
"Param3": "11",
"Param4": "4",
"Param5": "18",
"Param6": "20",
"Param7": "8"
},
{
"Param6": "21",
"Param7": "8",
"Param8": "11",
"Param9": "4",
"Param10": "18"
},
{
"Param1": "20",
"Param2": "8",
"Param3": "10"
}
];
const uniqueArray = removeDuplicates(arr1);
console.log(JSON.stringify(uniqueArray, null, 2));输出结果:
[
{
"Param1": "20",
"Param2": "8",
"Param3": "11",
"Param4": "4",
"Param5": "18",
"Param6": "20",
"Param7": "8"
},
{
"Param6": "21",
"Param8": "11",
"Param9": "4",
"Param10": "18"
},
{
"Param3": "10"
}
]通过利用 Array.prototype.reduce 结合一个辅助的 seen 映射,我们能够高效且清晰地从对象数组中提取出仅包含唯一键值对的新数组。这种模式在处理需要基于多维条件去重的数据时非常有用,并且可以根据具体需求进行调整,例如,如果去重条件是基于键而不是键值对,则 seen 映射的结构可以进一步简化。理解并掌握这种技术,有助于开发者在JavaScript中更灵活地处理复杂的数据结构。
以上就是JavaScript中从对象数组中提取唯一键值对的教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号