0

我需要解析以下字符串:

"Apple-sweet#tangy@Bannana@Orange-citrusy@Pear-crispy#green/yellow"

除了第一个以“@”开头的项目外,每个项目都是键,“-”表示该键的子项目的开始。“#”用相同的键分隔每个子项。

进入类似这样的对象:

{
"Apple": ["sweet", "tangy"],
"Bannana":[],
"Orange": ["citrusy"],
"Pear": ["crispy", "green/yellow"]
}

解析这个的最佳方法是什么?

4

4 回答 4

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);

首先,您拆分@以从对象中获取每个项目作为单独的数组值。然后,您拆分该数组中的每个项目-以获取键和值。之后,您需要确保这些值存在,如果存在,请将它们拆分#以获取它们的数组。

演示:http: //jsbin.com/avuGagu/1/edit

于 2013-11-05T16:24:32.367 回答
3

你可以试试这个(例子在这里

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);

示例在这里。

于 2013-11-05T16:29:03.220 回答
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;
    }
}

小提琴

于 2013-11-05T16:18:53.747 回答
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,尽管在这种特殊情况下它有点矫枉过正;)

于 2013-11-05T17:12:38.937 回答