我在JS中以var的形式收到以下文本,这是我从另一个函数获得的。
var text = '["{"a1":"zxcv","a2":"pqrs","c2":[1,2,3],"a3":{"aa3":"asdfgh","aa5":null}}","{"a1":"xyz","a2":"mno","c2":[103],"a3":{"aa8":"qwerty"}}"]';
我需要检查a1,a2,c2及其值的计数以及a3及其值的计数。 例如:a1:2,a2:2,c2:4,a3:3等(子元素的数量也是如此)
我认为获得结果的粗略方法是:首先删除第一个和最后一个“,然后将}”,“ {替换为},{ 这给了我一个对象的json数组,并使用JSON.parse给了我更好的转换结构,然后我就可以轻松遍历它了。 我找不到任何库或其他解决方案来代替它。
var text = '["{"a1":"zxcv","a2":"pqrs","c2":[1,2,3],"a3":{"aa3":"asdfgh","aa5":null}}","{"a1":"xyz","a2":"mno","c2":[103],"a3":{"aa8":"qwerty"}}"]';
console.log(text);
text = text.replace(/\["{/g, "[{"); // remove first double quote
text = text.replace(/\}"]/g, "}]"); // remove last double quote
text = text.replace(/\}","{/g, "},{"); // replace middle quotes
console.log(text);
var formattedText = JSON.parse(text);
console.log(formattedText);
我以对象形式获得它后的预期输出,因为这样我就可以遍历对象并使用计数器来保持计数:
a1:2,a2:2,c2:4,a3:3
是否有任何功能(内置的或带有库的)可以帮助我解决这个问题?
答案 0 :(得分:2)
您可以尝试通过删除不是键/值分隔符的引号并将其解析为json来修复该字符串:
var text = '["{"a1":"zxcv","a2":"pqrs","c2":[1,2,3],"a3":{"aa3":"asdfgh","aa5":null}}","{"a1":"xyz","a2":"mno","c2":[103],"a3":{"aa8":"qwerty"}}"]';
t = text
.replace(/"([^"]+)":/g, '@$1@:')
.replace(/:"([^"]+)"/g, ':@$1@')
.replace(/"/g, '')
.replace(/@/g, '"')
console.log(JSON.parse(t))
如果您对这些替代品的确切用途感兴趣,请按以下步骤进行可视化操作:
var text = '["{"a1":"zxcv","a2":"pqrs","c2":[1,2,3],"a3":{"aa3":"asdfgh","aa5":null}}","{"a1":"xyz","a2":"mno","c2":[103],"a3":{"aa8":"qwerty"}}"]';
String.prototype.show = function(s) {
console.log(s + ": " + this);
return this;
}
t = text
.show('Init')
.replace(/"([^"]+)":/g, '@$1@:')
.show('Step 1')
.replace(/:"([^"]+)"/g, ':@$1@')
.show('Step 2')
.replace(/"/g, '')
.show('Step 3')
.replace(/@/g, '"')
.show('Step 4')