我正在使用 Pinch 库修改 JSON 文件/Javascript 对象:https://github.com/Baggz/Pinch
在此示例中,带有正则表达式参数 /id/
的 pinch()
将所有 id 值修改为 321
。
我想要做的是能够基于参数 (requestorToChange
) 更改所有 id 的值,但仅限于特定的“请求者”。让我们说“RequestorX”。我该如何编写它的正则表达式?
var sample = {
"RequestorX":
[{
user: {
id: '123'
},
request: {
id: '456'
},
book: {
id: '789'
}
}],
"RequestorY":
[{
user: {
id: '111'
},
request: {
id: '222'
},
book: {
id: '333'
}
}]
};
const requestorToChange = 'RequestorX'
pinch(sample, /id/, function(path, key, value) {
return '321';
});
console.log(JSON.stringify(sample))
我知道一个选择就是这样做:
pinch(sample['RequestorX'], /id/, function(path, key, value) {
return '321';
});
但我需要能够通过正则表达式字段来完成此操作,因为实际上,我将操作深度嵌套的 JSON 文件。
最佳答案
GitHub 页面上的解释有点稀疏,但基本上你从点符号替换样式开始,用正则表达式模式替换变量部分,同时遵守 JS 正则表达式的规则。
因此,在您的情况下,点表示法模式 'RequestorX[0].user.id'
变成像 /RequestorX\[0\]\.(user|request|book)\.id/
一些注释:
- 首先我们必须转义方括号,因为它们在正则表达式中具有特殊含义
- 接下来,我们还必须逃避 .将其用作点符号
- 我们使用一个具有交替的组来替换所有组上的 id
我尝试使用
new RegExp
而不是/../
表示法来创建正则表达式对象以将常量添加到模式中,不幸的是只有在这种情况下第一项被替换,可能是一个错误......pinch(sample, new RegExp(requestorToChange +'\[0\]\.(user|request|book)\.id'), '321');
示例代码(SO代码片段输出一些关于RequestorY的额外乱码,忽略它)
var sample = {
"RequestorX": [
{
"user": {
"id": "123"
},
"request": {
"id": "456"
},
"book": {
"id": "789"
}
}
],
"RequestorY": [
{
"user": {
"id": "123"
},
"request": {
"id": "456"
},
"book": {
"id": "789"
}
}
]
}
const requestorToChange = 'RequestorX';
//var result = pinch(sample, 'RequestorX[0].user.id', '321'); //replace the user id of RequestorX with dot notation
var result = pinch(sample, /RequestorX\[0\]\.(user|request|book)\.id/, '321');
//var result = pinch(sample, new RegExp(requestorToChange +'\[0\]\.(user|request|book)\.id'), '321');
console.log(JSON.stringify(result));
<script src="https://cdn.jsdelivr.net/npm/pinch@0.1.3/src/pinch.js"></script>
唉,JSON + 正则表达式听起来有点奇怪,但该工具看起来合法。
关于javascript - Node JS 中使用捏.js 的子字符串正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60219808/