递归字符串解析为对象
Recursive string parsing into object
大家好,我正在尝试将字符串数组解析为自定义结构:
var str = [
"country.UK.level.1",
"country.UK.level.2",
"country.US.level.1",
"country.UK.level.3"
];
变成:
var ordered = {
"country": [
{"UK" : {"level" : ["1", "2", "3"]}},
{"US" : {"level" : ["1","2"]}}
]
}
指出:
- 存储在
str
数组中的字符串不会被排序,代码应该健壮。 - 字符串将遵循
x.y.x.y...
模式,其中x
对于该数组是唯一的,y
可以改变。在我的示例中,country
和level
将始终与它们表示x
pos相同。 - 这需要递归方法,因为存储在
str
数组中的字符串可以是任意长度。字符串越长嵌套越深。
如果你的对象的最后一层是一个数组,这应该对你有用:
var str = [
"country.UK.level.1",
"country.UK.level.2",
"country.US.level.1",
"country.UK.level.3"
];
var obj = {};
str.forEach(function(str){
var curr = obj;
var splitted = str.split('.');
var last = splitted.pop();
var beforeLast = splitted.pop();
splitted.forEach(function(sub){
if(!curr.hasOwnProperty(sub))
{
curr[sub] = {};
}
curr = curr[sub];
});
if(!curr[beforeLast]){
curr[beforeLast] = [];
}
curr[beforeLast].push(last);
})
console.log(obj);
JSFIDDLE .
此解决方案使用了Array.prototype.forEach
和Array.prototype.reduce
。
var str = [
"country.UK.level.1",
"country.UK.level.2",
"country.US.level.1",
"country.UK.level.3"
],
ordered = {};
str.forEach(function (a) {
var aa = a.split('.'),
val = aa.pop(),
last = aa.length - 1;
aa.reduce(function (obj, pro, i) {
if (!(pro in obj)) {
obj[pro] = i === last ? [] : {};
}
return obj[pro];
}, ordered).push(val);
});
document.write('<pre>' + JSON.stringify(ordered, 0, 4) + '</pre>');
相关文章:
- 如何使用jquery读取对象字符串
- 用javascript修复这个JSON对象字符串最干净的方法是什么
- Javascript对象字符串值-在应该隐藏的时候呈现的HTML代码
- 在Nodejs中将数组转换为类似子的对象字符串
- 对象字符串转换为JSON(抛出错误)
- 如何将事件对象字符串化
- 如何在 JavaScript 中将 JSON 对象字符串化为负零
- 将 JSON 对象字符串数组转换为 JS 对象数组
- 如何在角度转换请求中将对象字符串转换为 JSON 对象
- 删除开头的双引号&结束于JSON对象/字符串或Java脚本变量
- 将json对象字符串转换为值
- 如何迭代json对象字符串
- 将数组列表转换为json对象字符串
- 如何将继承的对象字符串化为JSON
- 如何按对象字符串值之一对对象数组进行数字排序
- 解析日期对象字符串并获取以毫秒为单位的时间
- 如何在javascript中解析javascript对象字符串
- Javascript类对象字符串到对象
- 从使用.data()添加的对象字符串中获取值
- 如何在javascript中添加一个函数变量到对象字符串