Skip to content

Commit ec44e01

Browse files
committed
feat: 优化 JSON 比较工具功能并修复问题
- 修复 CLI 输出问题并完善参数处理 - 优化数组比较性能,使用 Map 记录元素频次 - 统一类型定义,明确 DiffResult 中 undefined 处理 - 更新 README 文档与实际功能保持一致 - 添加 CLI 集成测试和性能基准测试 - 改进错误处理和类型安全
1 parent 4b19162 commit ec44e01

12 files changed

Lines changed: 496 additions & 328 deletions

File tree

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
## 核心问题修复
2+
- 修复 CLI 不输出结果:在 `src/index.ts` 将 `formatter.format(...)` 的返回值打印或写文件;修正传参类型为 `files: string[]`(当前在 src/index.ts:192-197 使用了 `@ts-expect-error` 并传入对象)。
3+
- 对齐 README 与实际 CLI:移除未实现选项(如 `--recursive`、`--stats`、`--no-color`、`--output <file>`),或补齐实现;统一 `--output <format>` 文案为 `--output|-o` 并明确支持值。
4+
- 补充 UNCHANGED 逻辑:在比较流程中产生 `DiffType.UNCHANGED`,使 `--show-unchanged` 生效,并与 Formatter 的统计一致。
5+
6+
## 性能优化
7+
- 优化无序数组比较为 O(n):使用 Map 记录元素频次(`JSON.stringify` 后作为键),避免 `includes` 的 O(n^2);正确处理重复元素。
8+
- 早停与跳过路径:新增 `--skip <regex>` 与 `--only <regex>` 两个过滤选项,减少大型 JSON 的遍历范围;当对象键和长度均等且哈希一致时可短路(可选实现)。
9+
- 可配置 `maxDepth` 语义:明确“最大深度”是否包含数组索引层,必要时用统一的层级计算方法(对象层级+数组层级)替代仅按 `.` 统计。
10+
11+
## 代码质量与一致性
12+
- 类型统一:理清 `DiffItem[]` 与整体结果结构;将 Formatter 的 JSON/YAML 输出使用 `ComparisonResult`(含 `files`, `differences`, `summary`),并在类型层统一导出。
13+
- 移除重复统计实现:保留一个统计函数,比较器或格式化器二选一,避免分歧。
14+
- 单元测试对齐类型:修正 `tests/formatter.test.ts` 中将 `DiffResult` 用作整体结果的错误用法,改为显式数组或引入 `ComparisonResult`。
15+
16+
## 用户体验改进
17+
- CLI 选项增强:
18+
- `--output-file <path>` 将结果写入文件(复用 `OutputFormatter.outputToFile`),与 README 保持一致。
19+
- `--no-color` 控制着色(调用 `formatter.setColorEnabled(false)`)。
20+
- `--stats` 开关控制是否显示统计信息。
21+
- 错误与帮助:当正则无效或文件不可读时,输出更明确的引导;补充示例到 `--help`。
22+
23+
## 测试与验证
24+
- 新增 CLI 端到端测试:覆盖 `--output` 四种格式、`--ignore-order`、`--show-unchanged`、`--output-file`、`--no-color`、无效正则等。
25+
- 大文件与性能基准测试:构造 10k~100k 键对象与复杂数组,验证时间与内存占用;记录基线以监控回归。
26+
- 覆盖数组重复元素与深层嵌套、不同类型切换、`null/undefined` 混合等场景。
27+
28+
## 文档更新
29+
- 统一 README 的“命令行选项/示例/输出格式”与实际实现;补充限制、性能提示与最佳实践。

‎clis/json-diff-tool/README.md‎

Lines changed: 22 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -45,53 +45,36 @@ npm link
4545
json-diff file1.json file2.json
4646

4747
# 指定输出格式
48-
json-diff file1.json file2.json --format table
49-
json-diff file1.json file2.json --format json
50-
json-diff file1.json file2.json --format yaml
51-
json-diff file1.json file2.json --format tree
48+
json-diff file1.json file2.json --output table
49+
json-diff file1.json file2.json --output json
50+
json-diff file1.json file2.json --output yaml
51+
json-diff file1.json file2.json --output tree
5252

5353
# 保存结果到文件
54-
json-diff file1.json file2.json --output result.json
54+
json-diff file1.json file2.json --output-file result.txt
5555

56-
# 递归比较目录
57-
json-diff dir1/ dir2/ --recursive
58-
59-
# 显示统计信息
56+
# 显示统计信息/禁用颜色
6057
json-diff file1.json file2.json --stats
61-
62-
# 禁用颜色输出
6358
json-diff file1.json file2.json --no-color
6459
```
6560

66-
### PowerShell 包装脚本
67-
68-
项目还提供了 PowerShell 包装脚本,方便在 Windows 环境中使用:
61+
### Windows 使用说明
6962

70-
```powershell
71-
# 使用 PowerShell 脚本
72-
.\scripts\Compare-JsonFiles.ps1 -File1 "config1.json" -File2 "config2.json"
73-
74-
# 指定输出格式
75-
.\scripts\Compare-JsonFiles.ps1 -File1 "config1.json" -File2 "config2.json" -Format "table"
76-
77-
# 递归比较目录
78-
.\scripts\Compare-JsonFiles.ps1 -Directory1 "src" -Directory2 "backup" -Recursive
79-
80-
# 保存到文件
81-
.\scripts\Compare-JsonFiles.ps1 -File1 "config1.json" -File2 "config2.json" -OutputFile "diff.json"
82-
```
63+
在 Windows 11 下,建议使用 PowerShell 7+ 直接运行 `json-diff`,命令与参数与示例一致。
8364

8465
## 命令行选项
8566

8667
| 选项 | 简写 | 描述 | 默认值 |
8768
|------|------|------|--------|
88-
| `--format` | `-f` | 输出格式 (table, json, yaml, tree) | `table` |
89-
| `--output` | `-o` | 输出文件路径 | - |
90-
| `--recursive` | `-r` | 递归比较目录 | `false` |
91-
| `--stats` | `-s` | 显示统计信息 | `false` |
69+
| `--output <format>` | `-o` | 输出格式 (table\|json\|yaml\|tree) | `table` |
70+
| `--output-file <path>` | - | 将结果写入文件 | - |
71+
| `--show-unchanged` | `-u` | 显示未更改的值 | `false` |
72+
| `--ignore-order` | `-i` | 忽略数组顺序 | `false` |
73+
| `--depth <number>` | `-d` | 最大比较深度 | `10` |
74+
| `--filter <pattern>` | `-f` | 路径过滤正则表达式 | - |
75+
| `--stats` | `-s` | 显示统计信息 | `true` |
9276
| `--no-color` | - | 禁用颜色输出 | `false` |
93-
| `--help` | `-h` | 显示帮助信息 | - |
94-
| `--version` | `-v` | 显示版本信息 | - |
77+
| `--verbose` | `-v` | 详细输出 | `false` |
9578

9679
## 输出格式示例
9780

@@ -127,10 +110,10 @@ Statistics:
127110
}
128111
],
129112
"summary": {
130-
"total": 4,
131113
"added": 1,
132114
"removed": 1,
133-
"modified": 2
115+
"modified": 2,
116+
"unchanged": 0
134117
}
135118
}
136119
```
@@ -431,10 +414,13 @@ json-diff file1.json file2.json --verbose
431414
| 选项 | 简写 | 描述 | 默认值 |
432415
|------|------|------|--------|
433416
| `--output <format>` | `-o` | 输出格式 (table\|json\|yaml\|tree) | table |
417+
| `--output-file <path>` | - | 将结果写入文件 | - |
434418
| `--show-unchanged` | `-u` | 显示未更改的值 | false |
435419
| `--ignore-order` | `-i` | 忽略数组顺序 | false |
436420
| `--depth <number>` | `-d` | 最大比较深度 | 10 |
437421
| `--filter <pattern>` | `-f` | 路径过滤正则表达式 | - |
422+
| `--stats` | `-s` | 显示统计信息 | true |
423+
| `--no-color` | - | 禁用颜色输出 | false |
438424
| `--verbose` | `-v` | 详细输出 | false |
439425
| `--help` | `-h` | 显示帮助信息 | - |
440426
| `--version` | `-V` | 显示版本信息 | - |
@@ -535,4 +521,4 @@ mudssky
535521

536522
## 贡献
537523

538-
欢迎提交 Issue 和 Pull Request!
524+
欢迎提交 Issue 和 Pull Request!

0 commit comments

Comments
 (0)