0

0

JavaScript中从对象数组中提取唯一键值对的教程

霞舞

霞舞

发布时间:2025-12-02 15:20:08

|

647人浏览过

|

来源于php中文网

原创

JavaScript中从对象数组中提取唯一键值对的教程

本教程旨在解决javascript中从对象数组中移除重复键值对的问题。我们将通过一种高效的算法,利用一个跟踪已出现键值对的辅助数据结构(seen映射),结合array.prototype.reduce方法,遍历输入数组并构建新的对象,确保每个输出对象仅包含在此之前未曾出现的键值对。文章将提供详细的算法解析、typescript实现代码及使用示例,帮助开发者清晰地理解和应用此技术。

JavaScript中提取对象数组的唯一键值对

在处理复杂数据结构时,我们经常需要对数据进行清洗和去重。一个常见的场景是,给定一个包含多个对象的数组,我们希望从这些对象中移除那些键值对(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免费学习笔记(深入)”;

雾象
雾象

WaytoAGI推出的AI动画生成引擎

下载
[
  {
    "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" 是新的
  }
]

解决方案算法

解决此问题的核心思想是维护一个“已见”状态,记录所有已经处理过的键值对。当遍历数组中的每个对象及其键值对时,我们检查当前键值对是否已在“已见”状态中。

  1. 初始化 seen 映射: 创建一个空的映射(或JavaScript对象),用于存储已遇到的所有 key:value 组合。其结构可以是 { key: { value: boolean } },其中 boolean 值表示该键值对是否已出现。
  2. 初始化 result 数组: 创建一个空数组,用于存储最终处理后的对象。
  3. 遍历输入数组: 逐个处理输入数组中的每个对象。
  4. 构建新对象: 对于当前正在处理的对象,创建一个新的空对象,用于存放其独特的键值对。
  5. 遍历当前对象的键值对: 迭代当前对象的所有 key:value 对。
  6. 检查唯一性并更新 seen:
    • 首先,确保 seen 映射中存在当前 key 的条目(如果不存在,则初始化为一个空对象)。
    • 检查 seen[key][value] 是否为 true。
    • 如果为 true,表示此 key:value 对已经出现过,跳过它。
    • 如果为 false 或 undefined,表示此 key:value 对是首次出现。将其添加到当前正在构建的新对象中,并将 seen[key][value] 设置为 true,以标记其已出现。
  7. 添加至结果: 将构建好的新对象(仅包含独特键值对)添加到 result 数组中。
  8. 返回 result: 遍历完成后,返回 result 数组。

JavaScript/TypeScript 实现

我们可以使用 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"
  }
]

注意事项

  1. 值类型限制: 上述实现假设对象的值是原始类型(如字符串、数字),因为它们可以直接用作 seen 映射的键。如果值是对象或数组,则需要进行序列化(如 JSON.stringify)才能在 seen 映射中进行准确比较和存储。
  2. 性能: 该方法的时间复杂度大致为 O(N*K),其中 N 是输入数组的长度,K 是每个对象平均的键值对数量。由于使用了哈希表(JavaScript 对象)作为 seen 映射,查找和插入操作的平均时间复杂度为 O(1)。
  3. 原始数据不变性: 此实现不会修改原始 arr 数组或其中的任何对象,而是返回一个全新的数组和对象,符合函数式编程的原则。
  4. 键值对的顺序: Object.fromEntries 和 Object.entries 默认会保留键的插入顺序(在ES2015及更高版本中),但对于去重逻辑本身,键值对在对象内部的顺序并不影响其唯一性判断。

总结

通过利用 Array.prototype.reduce 结合一个辅助的 seen 映射,我们能够高效且清晰地从对象数组中提取出仅包含唯一键值对的新数组。这种模式在处理需要基于多维条件去重的数据时非常有用,并且可以根据具体需求进行调整,例如,如果去重条件是基于键而不是键值对,则 seen 映射的结构可以进一步简化。理解并掌握这种技术,有助于开发者在JavaScript中更灵活地处理复杂的数据结构。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

47

2026.02.13

TypeScript全栈项目架构与接口规范设计
TypeScript全栈项目架构与接口规范设计

本专题面向全栈开发者,系统讲解基于 TypeScript 构建前后端统一技术栈的工程化实践。内容涵盖项目分层设计、接口协议规范、类型共享机制、错误码体系设计、接口自动化生成与文档维护方案。通过完整项目示例,帮助开发者构建结构清晰、类型安全、易维护的现代全栈应用架构。

194

2026.02.25

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

457

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

547

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

335

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

java中boolean的用法
java中boolean的用法

在Java中,boolean是一种基本数据类型,它只有两个可能的值:true和false。boolean类型经常用于条件测试,比如进行比较或者检查某个条件是否满足。想了解更多java中boolean的相关内容,可以阅读本专题下面的文章。

367

2023.11.13

java boolean类型
java boolean类型

本专题整合了java中boolean类型相关教程,阅读专题下面的文章了解更多详细内容。

42

2025.11.30

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 6万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3.4万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号