javascript - How to Parse a String in Java Script language which contains "color code change" numericals into the string such as 32m+ or 31m-
问题描述
I'm trying to write a Firebase cloud function in java script, which sends the email notification on any new change in the Firebase remote config. On any remote config change, I do get the string in below format,
{ parameters: { [32m+ newer_value: { [39m [32m+ defaultValue: { [39m [32m+ value: "gaa_new" [39m [32m+ } [39m [32m+ } [39m } version: { [31m- versionNumber: "498" [39m [32m+ versionNumber: "499" [39m [31m- updateTime: "2021-03-09T17:57:08.755697Z" [39m [32m+ updateTime: "2021-03-09T18:01:05.485532Z" [39m } }
So I wanted to know how to get meaningful change information from the above string. (Email part is sorted to me)
Here is the string in different operations :
- When added a new key
{ parameters: { [32m+ newer_value: { [39m [32m+ defaultValue: { [39m [32m+ value: "gaa_new" [39m [32m+ } [39m [32m+ } [39m } version: { [31m- versionNumber: "498" [39m [32m+ versionNumber: "499" [39m [31m- updateTime: "2021-03-09T17:57:08.755697Z" [39m [32m+ updateTime: "2021-03-09T18:01:05.485532Z" [39m } }
Expected Output Message :
A new key is added,
key name : newer_value
value : gaa_new
{ parameters: { [32m+ add_config: { [39m [32m+ defaultValue: { [39m [32m+ value: "test" [39m [32m+ } [39m [32m+ } [39m } version: { [31m- versionNumber: "500" [39m [32m+ versionNumber: "501" [39m [31m- updateTime: "2021-03-09T18:14:14.954691Z" [39m [32m+ updateTime: "2021-03-09T18:19:15.276567Z" [39m } }
Expected Output Message :
A new key is added,
key name : add_config
value : test
- When remove multiple keys :
{ parameters: { [31m- dummy_value: { [39m [31m- defaultValue: { [39m [31m- value: "10" [39m [31m- } [39m [31m- } [39m [31m- newer_value: { [39m [31m- defaultValue: { [39m [31m- value: "gaa_new" [39m [31m- } [39m [31m- } [39m } version: { [31m- versionNumber: "499" [39m [32m+ versionNumber: "500" [39m [31m- updateTime: "2021-03-09T18:01:05.485532Z" [39m [32m+ updateTime: "2021-03-09T18:14:14.954691Z" [39m } }
Expected Output Message :
few existing keys are removed,
a. key name : dummy_value
value : 10
b. key name : newer_value
value : gaa_new
- When same key value is updated :
{ parameters: { dummy_value: { defaultValue: { [31m- value: "100000" [39m [32m+ value: "10" [39m } } } version: { [31m- versionNumber: "497" [39m [32m+ versionNumber: "498" [39m [31m- updateTime: "2021-03-09T17:45:47.053923Z" [39m [32m+ updateTime: "2021-03-09T17:57:08.755697Z" [39m } }
Expected Output Message :
key name : dummy_value
old value : 100000
new value : 10
31m+ -> addition of something
31m- -> deletion of something
Please help me how to proceed with that, if there is any library to achieve that then also please let me know and if not then how to traverse a string and evaluate the same.
UPDATE 1 : Here I'm mentioning my theoretical approach : When encountered "parameters" string, will look for { or {31m+ {31m- based on that would identifiy the operation as Updated, Added or deleted respectively , and the key would be identified as next string before : and after { or {32m+ or {31m- and so on.
UPDATE 2 : I used json diff without color codes as suggested by "Nina" in the comments but somehow that is not giving correct result when I am trying to send that into my email utility.
解决方案
You could separate the lines with escape colors and check the signs.
const
process = string => {
const lines = string.match(/\[3\dm.*?\[39m/g).map(s => s.slice(4, -4));
let colon = lines[0].indexOf(':'),
i = 0,
key = '';
if (lines[0][0] === '-' && lines[1][0] === '+' && lines[0].slice(1, colon) === lines[1].slice(1, colon)) {
return [
'UPDATE A KEY',
`key name : ${lines[0].slice(1, colon).trim()}`,
`old value: ${JSON.parse(lines[0].slice(colon + 1))}`,
`new value: ${JSON.parse(lines[1].slice(colon + 1))}`
];
}
while (lines[i].slice(colon + 1).trim() === '{') {
key += (key && '.') + lines[i].slice(1, colon).trim();
colon = lines[++i].indexOf(':');
}
key += (key && '.') + lines[i].slice(1, colon).trim();
return [
lines[0][0] === '-' ? 'DELETE A KEY' : 'ADD A KEY',
`key name: ${key}`,
`value : ${JSON.parse(lines[i].slice(colon + 1))}`,
];
},
data = [
'{ parameters: { [32m+ newer_value: { [39m [32m+ defaultValue: { [39m [32m+ value: "gaa_new" [39m [32m+ } [39m [32m+ } [39m } version: { [31m- versionNumber: "498" [39m [32m+ versionNumber: "499" [39m [31m- updateTime: "2021-03-09T17:57:08.755697Z" [39m [32m+ updateTime: "2021-03-09T18:01:05.485532Z" [39m } }',
'{ parameters: { [32m+ add_config: { [39m [32m+ defaultValue: { [39m [32m+ value: "test" [39m [32m+ } [39m [32m+ } [39m } version: { [31m- versionNumber: "500" [39m [32m+ versionNumber: "501" [39m [31m- updateTime: "2021-03-09T18:14:14.954691Z" [39m [32m+ updateTime: "2021-03-09T18:19:15.276567Z" [39m } }',
'{ parameters: { [31m- dummy_value: { [39m [31m- defaultValue: { [39m [31m- value: "10" [39m [31m- } [39m [31m- } [39m [31m- newer_value: { [39m [31m- defaultValue: { [39m [31m- value: "gaa_new" [39m [31m- } [39m [31m- } [39m } version: { [31m- versionNumber: "499" [39m [32m+ versionNumber: "500" [39m [31m- updateTime: "2021-03-09T18:01:05.485532Z" [39m [32m+ updateTime: "2021-03-09T18:14:14.954691Z" [39m } }',
'{ parameters: { dummy_value: { defaultValue: { [31m- value: "100000" [39m [32m+ value: "10" [39m } } } version: { [31m- versionNumber: "497" [39m [32m+ versionNumber: "498" [39m [31m- updateTime: "2021-03-09T17:45:47.053923Z" [39m [32m+ updateTime: "2021-03-09T17:57:08.755697Z" [39m } }'
];
console.log(data.map(process));
.as-console-wrapper { max-height: 100% !important; top: 0; }
推荐阅读
- r - 给定大量重新编码数据的 CSV,编写映射函数的最有效方法
- php - mysql laravel 可以外连接还是全连接?
- oracle - 在注册表中添加一列
- php - 检查 laravel 注册表单中的重复条目
- docker - Docker 安装问题
- php - 如何从用于 CSV 导出的数组中删除空元素
- java - 默认情况下,在 jersey api 中未为 formdata 设置 Content-Length
- ckeditor - 在 CKEditor 5 中获取当前选定的元素
- python - FileNotFound 错误/使用 PyPDF2 和 os.listdir() 读取 PDF 文件
- list - 将两个列表的值与 tcl 中的科学值进行比较,并返回新列表中的最高值