我正在使用 Node js 中的 Commander 来构建 cli。
我创建了一个命令 groupBy,它使用 2 个选项:
我可以打印这个:
$ index.js groupBy --paths path1 path2 --jsonPaths jsonPath1 jsonPath2
In the given files path1, path2
I want to show jsonPath1, jsonPath2 values
现在我希望能够为某些 jsonPath 添加按值过滤器
要打印此内容:
In the given files path1, path2
I want to show jsonPath1, jsonPath2, jsonPath3 values
Not filtering on jsonPath1
Filtering by value1 on jsonPath2
Filtering by value2, value3 on jsonPath3
我正在寻找一种方法来编写命令以允许这样做。
这里我添加了3个值进行过滤,但不知道哪一个适用于jsonPath1、2或3。
$ index.js groupBy --paths path1 path2 --jsonPaths jsonPath1 jsonPath2 jsonPath3 --values value1 value2 value3
有什么想法吗?谢谢。
要实现在命令行工具中为不同 JSON 路径指定过滤器的所需功能,您可以以将每个过滤器值与相应 JSON 路径明确关联的方式构建命令行参数。
$ index.js groupBy --paths path1 path2 --jsonPaths jsonPath1 jsonPath2 jsonPath3 --filter jsonPath1 "" --filter jsonPath2 value1 --filter jsonPath3 value2 value3
Js
const args = process.argv.slice(2);
const filters = {};
let currentJsonPath = null;
for (let i = 0; i < args.length; i++) {
const arg = args[i];
if (arg === "--filter") {
const jsonPath = args[i + 1];
const filterValues = args.slice(i + 2);
filters[jsonPath] = filterValues;
i += filterValues.length + 1;
} else {
currentJsonPath = arg;
}
}
console.log("In the given files", args.slice(0, args.indexOf("--jsonPaths")).join(", "));
for (const jsonPath of args.slice(args.indexOf("--jsonPaths") + 1, args.indexOf("--filter"))) {
console.log(`I want to show ${jsonPath} values`);
if (jsonPath in filters) {
const filterValues = filters[jsonPath];
if (filterValues.length === 0) {
console.log("Not filtering on", jsonPath);
} else {
console.log("Filtering by", filterValues.join(", "), "on", jsonPath);
}
}
}