如何将字符串元素解析为JS中的对象?

时间:2013-11-05 16:13:10

标签: javascript

我需要解析以下字符串:

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

除第一个以&#34开头的项目以外的每个项目; @"是关键," - "表示该键的子项的开始。 "#"用相同的键分隔每个子项。

进入与此类似的对象:

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

解析此问题的最佳方法是什么?

4 个答案:

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

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

DEMO:http://jsbin.com/avuGagu/1/edit

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

Example Here.

答案 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;
    }
}

FIDDLE

答案 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,虽然在这种特殊情况下它有点矫枉过正;)