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

How to parse out string elements into objects in JS?

本文关键字:元素 对象 字符串 JS      更新时间:2023-09-26

我需要解析以下字符串:

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

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

放入类似于以下内容的对象中:

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

解析此内容的最佳方法是什么?

您需要多次通过保护符号拆分字符串:

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

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

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

这里的例子。

你只需要很多字符串操作函数

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

小提琴

只是为了好玩,我试图在 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,尽管在这种特殊情况下它有点矫枉过正;)