javascript中带字符串的嵌套数组形式

时间:2018-12-20 10:22:19

标签: javascript arrays json

我有一个字符串作为“ 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

3 个答案:

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