我有一个字符串作为“ a.b.c.d:50”,所以我想用上面的字符串作为t[a][b][c][d]=50
组成一个数组。所以我试图拆分代码和形式,但n值的长度将动态生成。请让我知道如何实现。对于固定数组,我尝试如下进行操作,但对于n个数组,无法做到这一点。
var str1="a.b.c.d:50";
var str=str1.split(":");
var dump=str[0].split(".");
t[dump[0]][dump[1]][dump[2]][dump[3]]=dump[4]
那么结果将是t[a][b][c][d]=50
答案 0 :(得分:0)
您可以获取JSON字符串,对其进行解析并通过保存最后一个键来迭代嵌套结构的所有键/值对,并创建不存在的新对象并为vlaue分配last属性。
function setValue(object, path, value) {
var last = path.pop();
path.reduce((o, k) => o[k] = o[k] || {}, object)[last] = value;
}
var json = '{"subscriber.userTier.segment": "Red"}',
object = {};
Object
.entries(JSON.parse(json))
.forEach(([keys, value]) => setValue(object, keys.split('.'), value));
console.log(object);
答案 1 :(得分:0)
您可以使用ES6吗?这是我刚刚写的东西
var t = {a:{b:{c:{d:0}}}};
var str = "a.b.c.d:50"
var [chain, value] = str.split(':')
var parts = chain.split('.');
parts.slice(0, -1).reduce((c, v) => c[v], t)[parts[parts.length - 1]] = value;
console.log(t.a.b.c.d); // logs "50"
它有效,但是没有错误处理。例如,如果未定义t['a']['b']
,则将收到未捕获的TypeError,并且如果字符串格式不正确等,也将无法使用。
从本质上讲,它在数组reduce
上使用['a', 'b', 'c']
。我们将t
作为reducer的初始值,然后对数组中的每个项目进行currentValue = currentValue[nextPart]
。这将为您提供对象c
,然后我们查看parts
数组中的最后一个值并设置属性currentValue[lastPart] = value
这是一个简短的概述,希望您了解其余情况。如果不能随意问:)
答案 2 :(得分:0)
如果将字符串构造为有效对象,则将字符串转换为JSON对象的快捷方法。
var str = "a.b.c.d:50";
str = str.replace(/([a-z]){1}/gi, "\"$1\"");
str.split(".").forEach(function (value) {
str = str.replace(/\.(.*?)$/, ":{$1}");
});
var ar = JSON.parse("{"+str+"}");
console.log(ar);