You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Node.js中移除数组特定对象并保存至JSON文件?

在Node.js中处理重复工单并保存回文件

以下是实现需求的具体步骤和代码:

实现思路

  1. 读取database.json文件内容并解析为JavaScript对象
  2. 统计opened_tickets数组中每个userid+ticketid组合的出现次数
  3. 过滤数组,移除所有出现次数超过1的组合条目(匹配你给出的处理结果);若需求是保留每个组合的唯一实例,可改用另一种逻辑
  4. 将处理后的对象转换为格式化的JSON字符串
  5. 写回原文件

完整代码

const fs = require('fs').promises;
const path = require('path');

async function processTickets() {
  try {
    // 定位目标文件路径
    const filePath = path.join(__dirname, 'database.json');
    // 读取文件内容
    const fileContent = await fs.readFile(filePath, 'utf8');
    // 解析JSON为JS对象
    const data = JSON.parse(fileContent);

    // 统计每个(userid, ticketid)组合的出现次数
    const comboCounts = {};
    data.opened_tickets.forEach(ticket => {
      const comboKey = `${ticket.userid}-${ticket.ticketid}`;
      comboCounts[comboKey] = (comboCounts[comboKey] || 0) + 1;
    });

    // 过滤:仅保留出现次数为1的条目(匹配你提供的处理结果)
    data.opened_tickets = data.opened_tickets.filter(ticket => {
      const comboKey = `${ticket.userid}-${ticket.ticketid}`;
      return comboCounts[comboKey] === 1;
    });

    // 可选:若需求是保留每个组合的唯一实例(而非删除所有重复组合),使用以下逻辑
    // const seenCombos = new Set();
    // data.opened_tickets = data.opened_tickets.filter(ticket => {
    //   const comboKey = `${ticket.userid}-${ticket.ticketid}`;
    //   if (seenCombos.has(comboKey)) return false;
    //   seenCombos.add(comboKey);
    //   return true;
    // });

    // 转换为格式化的JSON字符串(保持原文件缩进风格)
    const updatedContent = JSON.stringify(data, null, 2);
    // 写回原文件
    await fs.writeFile(filePath, updatedContent, 'utf8');

    console.log('工单处理完成,已保存回原文件');
  } catch (err) {
    console.error('处理过程中出现错误:', err);
  }
}

// 执行处理函数
processTickets();

注意事项

  • 确保脚本与database.json在同一目录,或根据实际情况调整filePath的路径
  • 运行前建议备份原文件,防止意外数据丢失
  • 若处理超大型JSON文件,建议改用流式读写以优化内存占用

内容的提问来源于stack exchange,提问作者justnn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 23:55:23