Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将JSON对象中的字符串键转换为子对象?_Javascript_Regex_Json - Fatal编程技术网

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

Javascript 将JSON对象中的字符串键转换为子对象?,javascript,regex,json,Javascript,Regex,Json,我循环了document.form.element,这些名称被构造成一个数组名,如下所示: 电流输出 这些密钥的一些名称在JSON中类似: { data[name]: "foo", data[address]: "baz drive", data[city]: "Dallas", data[state]: "Texas", data[phone]: "555-1212" } 期望输出 有没有一种方法可以在不使用eval的情况下,用纯JavaScript

我循环了document.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"
    }
}
到目前为止我试过什么

变量o={
数据[名称]:“foo”,
数据[地址]:“baz驱动器”,
数据[城市]:“达拉斯”,
数据[州]:“德克萨斯州”,
数据[电话]:“555-1212”
}
var-temp=[];
用于(输入o){
temp[JSON.parse(key)]=o;
}
小提琴在这里:

或者这不完全可能吗?

你喜欢吗

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);
这是。

你喜欢吗

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);
这是。

你喜欢吗

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);
这是。

你喜欢吗

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

下面是。

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

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;
};


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

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;
};

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

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;
};


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

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;
};

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

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;
};


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

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;
};

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

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;
};


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

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;
};