我需要解析以下字符串:
"Apple-sweet#tangy@Bannana@Orange-citrusy@Pear-crispy#green/yellow"
除第一个以&#34开头的项目以外的每个项目; @"是关键," - "表示该键的子项的开始。 "#"用相同的键分隔每个子项。
进入与此类似的对象:
{
"Apple": ["sweet", "tangy"],
"Bannana":[],
"Orange": ["citrusy"],
"Pear": ["crispy", "green/yellow"]
}
解析此问题的最佳方法是什么?
答案 0 :(得分:5)
您需要多次将保护符号拆分为字符串:
var str = 'Apple-sweet#tangy@Bannana@Orange-citrusy@Pear-crispy#green/yellow';
var result = {};
str.split('@').forEach(function(item){
var split = item.split('-');
result[split[0]] = split[1] && split[1].split('#') || [];
});
console.dir(result);
首先按@
拆分,将对象中的每个项目作为单独的数组值。然后,您通过-
拆分该数组中的每个项目,以获取密钥和值。之后,您需要确保值存在,如果存在,请将它们拆分为#
以获取它们的数组。
答案 1 :(得分:3)
您可以尝试此操作(Example Here)
var str = "Apple-sweet#tangy@Bannana@Orange#citrusy@Pear#crispy#green/yellow";
var arr = str.split('@'), i = 0, l= arr.length, obj = {} ;
for(; i< l; i++){
var a = arr[i].split(/-|#/);
obj[a[0]] = a.splice(1);
}
console.log(obj);
此外,您可以使用(制作密钥lowercase
,以便使用apple
代替Apple
)
obj[a[0].toLowerCase()] = a.splice(1);
答案 2 :(得分:1)
你只需要很多字符串操作函数
var inputString = "Apple-sweet#tangy@Bannana@Orange-citrusy@Pear-crispy#green/yellow";
var keyValues = inputString.split("@");
var obj = {};
for (var i = 0; i < keyValues.length; ++i) {
var index = keyValues[i].indexOf("-");
if (index == -1) {
obj[keyValues[i]] = [];
} else {
var key = keyValues[i].substring(0, index);
var values = keyValues[i].substring(index + 1).split("#");
obj[key] = values;
}
}
答案 3 :(得分:0)
为了好玩,我试图在PEG.js中实现你的“语法”
去那里http://pegjs.majda.cz/online并在语法部分(1)上粘贴以下语法。
start
= fruits
fruits
= ft:fruit "@" fts:fruits {fts[ft[0]] = ft[1]; return fts;}
/ ft:fruit {var fruits = {}; fruits[ft[0]] = ft[1]; return fruits;}
fruit
= name:word "-" flavs:flavors {var ft = []; ft.push(name); ft.push(flavs); return ft;}
/ name:word {var ft = []; ft.push(name); ft.push([]); return ft;}
flavors
= flavor:word "#" flavs:flavors {flavs.unshift(flavor); return flavs;}
/ flavor:word { var tab = []; tab.push(flavor); return tab;}
word
= value:[a-zA-Z/]+ {return value.join("");}
然后将句子放入输入部分(2)
Apple-sweet#tangy@Bannana@Orange-citrusy@Pear-crispy#green/yellow
结果如下:
{
"Pear": [
"crispy",
"green/yellow"
],
"Orange": [
"citrusy"
],
"Bannana": [],
"Apple": [
"sweet",
"tangy"
]
}
然后将生成的javascript解析器嵌入到一个文件中,您不必担心词法/语法分析工作。更好的维护性只能在语义层面上工作恕我直言:)
相当强大的API,虽然在这种特殊情况下它有点矫枉过正;)