首页 > web前端 > js教程 > 正文

使用 JavaScript 比较两个 JSON 数组并提取差异

花韻仙語
发布: 2025-07-29 18:22:01
原创
882人浏览过

使用 javascript 比较两个 json 数组并提取差异

本文介绍了如何使用 JavaScript 比较两个 JSON 数组,并提取出第一个数组中存在,但第二个数组中不存在,且满足特定条件的元素。通过使用 Set 数据结构和数组的 map 方法,可以高效地实现此功能,并最终获得包含所需元素 ID 和名称的新数组。

比较两个 JSON 数组并提取差异

在 JavaScript 中,经常需要比较两个 JSON 数组,并根据特定条件提取出差异数据。例如,我们有两个数组 fruits 和 food,目标是从 fruits 中找出那些 name 不存在于 food 数组的 food_name 中,并且 food 数组中对应 food_name 的 deleted 字段不等于 "1" 的元素。

示例数据

立即学习Java免费学习笔记(深入)”;

首先,定义两个示例数组:

const fruits = [
  { id: '1', name: 'Apple' },
  { id: '2', name: 'Orange' },
  { id: '3', name: 'Cherry' }
];

const food = [
  { id: '1', food_name: 'Orange', deleted: "0" },
  { id: '2', food_name: 'Bread', deleted: "0" },
  { id: '3', food_name: 'Cheese', deleted: "0" },
  { id: '4', food_name: 'Apple', deleted: "1" },
  { id: '5', food_name: 'Salt', deleted: "0" }
];
登录后复制

实现步骤

  1. 创建 food_name 的集合 (Set)

    为了提高查找效率,首先从 food 数组中提取出所有的 food_name,并将其存储在一个 Set 数据结构中。Set 提供了快速的 has() 方法,用于检查某个值是否存在。

    标书对比王
    标书对比王

    标书对比王是一款标书查重工具,支持多份投标文件两两相互比对,重复内容高亮标记,可快速定位重复内容原文所在位置,并可导出比对报告。

    标书对比王 58
    查看详情 标书对比王
    var foodSet = new Set(food.map(item => item.food_name));
    登录后复制

    这里,food.map(item => item.food_name) 将 food 数组转换为一个包含所有 food_name 的新数组,然后使用 new Set() 创建一个 foodSet。

  2. 遍历 fruits 数组并进行比较

    接下来,遍历 fruits 数组,对于每个水果,检查其 name 是否存在于 foodSet 中,并且检查 food 数组中是否存在对应 food_name 且 deleted 不等于 "1" 的元素。

    var dep_data = [];
    
    for (var j = 0; j < fruits.length; j++) {
      if (!foodSet.has(fruits[j].name)) {
        const foodItem = food.find(item => item.food_name === fruits[j].name);
        if (!foodItem || foodItem.deleted !== "1") {
          dep_data.push({ id: fruits[j].id, name: fruits[j].name });
        }
      }
    }
    
    console.log(dep_data);
    登录后复制
    • !foodSet.has(fruits[j].name) 检查 fruits[j].name 是否不存在于 foodSet 中。
    • food.find(item => item.food_name === fruits[j].name) 查找 food 数组中是否存在 food_name 等于 fruits[j].name 的元素。
    • !foodItem || foodItem.deleted !== "1" 检查 foodItem 是否不存在(即 food 数组中没有找到对应的 food_name),或者 foodItem 存在但其 deleted 字段不等于 "1"。
    • 如果以上条件都满足,则将 fruits[j] 的 id 和 name 添加到 dep_data 数组中。

完整代码

const fruits = [
  { id: '1', name: 'Apple' },
  { id: '2', name: 'Orange' },
  { id: '3', name: 'Cherry' }
];

const food = [
  { id: '1', food_name: 'Orange', deleted: "0" },
  { id: '2', food_name: 'Bread', deleted: "0" },
  { id: '3', food_name: 'Cheese', deleted: "0" },
  { id: '4', food_name: 'Apple', deleted: "1" },
  { id: '5', food_name: 'Salt', deleted: "0" }
];

var dep_data = [];
var foodSet = new Set(food.map(item => item.food_name));

for (var j = 0; j < fruits.length; j++) {
  if (!foodSet.has(fruits[j].name)) {
    const foodItem = food.find(item => item.food_name === fruits[j].name);
    if (!foodItem || foodItem.deleted !== "1") {
      dep_data.push({ id: fruits[j].id, name: fruits[j].name });
    }
  }
}

console.log(dep_data);
登录后复制

输出结果

运行以上代码,将会得到以下结果:

[
  { "id": "3", "name": "Cherry" }
]
登录后复制

总结

通过使用 Set 数据结构和数组的 map 和 find 方法,可以高效地比较两个 JSON 数组,并根据特定条件提取出差异数据。这种方法避免了嵌套循环,提高了代码的执行效率。在实际应用中,可以根据具体的需求调整比较条件和提取的数据。请注意,该代码假定 food 数组中的 deleted 字段为字符串类型。如果它是数字类型,则需要相应地调整比较逻辑。

以上就是使用 JavaScript 比较两个 JSON 数组并提取差异的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门推荐
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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