如何在 JS 中将字符串元素解析为对象
How to parse out string elements into objects in JS?
我需要解析以下字符串:
"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,尽管在这种特殊情况下它有点矫枉过正;)
相关文章:
- 如何查找流星集合中最后一个元素/对象的id
- 如何在JSXGraph中传递元素对象而不是id
- 手动呈现原型JS元素对象
- 为什么jQuery's每个循环的函数都保存对元素对象的引用
- 通过 html 图像元素对象显示图像
- 在 Plain/Pure Javascript 中,你如何找出元素对象具有哪些可用的方法或属性
- 如何在Angualar的jqLite元素对象中按id查找元素
- XPath 元素/对象在使用 document.evaluate 时未定义
- 如何使用JQuery获取元素对象
- 使用jQuery元素对象作为数组键
- 传递元素对象
- Mootools元素>对象# & lt; HTMLDivElement>没有方法'addEvent'
- 迭代所有节点对象,而不仅仅是元素对象
- 当一个元素被点击时,另一个元素(对象)发送给函数
- 正在分配属性'由getElementById()在语句中返回的HTML元素对象的s
- 创建一个新的用户界面元素对象的Javascript原型
- 在javascript中继承了DOM元素对象!这段代码有什么问题?
- AppendChild不工作!,从DOM元素对象继承.我做错了什么?
- 有没有办法“得到”?就像getElementById()能够获取html元素对象一样,使用函数来获取javascript
- 如何返回javascript DOM元素对象,并从调用者appendChild(obj)它