将JSON对象中的字符串键转换为子对象

Convert a string key in a JSON object to a child object?

本文关键字:对象 转换 JSON 字符串      更新时间:2023-09-26

我已经遍历了一个文档。form.element将名称构造成一个数组名称,如下所示:

电流输出

它们键的一些名称在JSON:中是这样的

{ 
    data[name]: "foo",
    data[address]: "baz drive",
    data[city]: "Dallas",
    data[state]: "Texas",
    data[phone]: "555-1212"
}

所需输出

有没有一种方法可以在不使用eval的情况下,使用纯JavaScript(并且没有像jQuery这样的框架)将其转换为这个?:

{ 
    data: {
        name: "foo",
        address: "baz drive",
        city: "Dallas",
        state: "Texas",
        phone: "555-1212"
    }
}

到目前为止我试过什么

<script type="javascript">
var o =   { 
    data[name]: "foo",
    data[address]: "baz drive",
    data[city]: "Dallas",
    data[state]: "Texas",
    data[phone]: "555-1212"
}
var temp = [];
for (key in o) {
  temp[JSON.parse(key)] = o;
}
</script>

Fiddle在这里:http://jsfiddle.net/chrisjlee/medbzv9a/

还是这不完全可能?

喜欢

var o =   { 
    "data[name]": "foo",
    "data[address]": "baz drive",
    "data[city]": "Dallas",
    "data[state]": "Texas",
    "data[phone]": "555-1212"
};
o.data = {};
for (key in o) {
  var index = key.match(/[^[']]+(?=])/g);
    if(index) {
      o.data[index] = o[key];
      delete(o[key]);
    }
}
console.log(o);

这是a sample fiddle

下面的函数应该修复对象。它将以递归方式执行,也可以处理数组。

var fixKeys = function(obj) {
    if (typeof(obj) != "object")
        return obj;
    if (Object.prototype.toString.call(obj) == "[object Array]")
        return obj.map(arguments.callee);
    var newObj = {};
    for (var key in obj) {
        if (!obj.hasOwnProperty(key))
            continue;
        var m = /^('w+)'[('w+)']$/.exec(key);
        if (m) {
            newObj[m[1]] = newObj[m[1]] || {};
            newObj[m[1]][m[2]] = arguments.callee(obj[key]);
        } else {
            newObj[key] = arguments.callee(obj[key]);
        }
    }
    return newObj;
};

Fiddle


这里有一个更好的版本,可以处理这种类型的数据:

var o = { 
    "data[name]": "foo",
    "data[address][street]": "baz drive",
    "data[address][city]": "Dallas",
    "data[address][state]": "Texas",
    "data[phone]": "555-1212",
    someArray: [
        {"test[a]": 42},
        42
    ]
};

以防万一:

var fixKeys = function(obj) {
    if (typeof(obj) != "object")
        return obj;
    if (Object.prototype.toString.call(obj) == "[object Array]")
        return obj.map(arguments.callee);
    var newObj = {};
    for (var key in obj) {
        if (!obj.hasOwnProperty(key))
            continue;
        var m = /^('w+)(?:'['w+'])+$/.exec(key);
        if (m) {
            var subKey = key.substr(m[1].length);
            var subObj = newObj[m[1]] = newObj[m[1]] || {};
            while (m = /^'[('w+)']'[/.exec(subKey)) {
                subObj = subObj[m[1]] = subObj[m[1]] || {};
                subKey = subKey.substr(m[0].length - 1);
            }
            m = /^'[('w+)']$/.exec(subKey);
            subObj[m[1]] = arguments.callee(obj[key]);
        } else {
            newObj[key] = arguments.callee(obj[key]);
        }
    }
    return newObj;
};

Fiddle