将多维对象转换为查询字符串

use*_*349 2 javascript php

我有一个对象:

{"f":{"cid":"325","field_name[10][0]":"133","field_name[10][1]":"132","price":"320|3600"}}
Run Code Online (Sandbox Code Playgroud)

我想将此对象转换为查询字符串.我正在使用这个功能:

function toQueryString(obj, prefix) {
        var str = [];
        for(var p in obj) {
            var k = prefix ? prefix + "[" + p + "]" : p, v = obj[p];
            str.push(typeof v == "object" ?
              toQueryString(v, k) :
              encodeURIComponent(k) + "=" + encodeURIComponent(v));
        }
        return str.join("&");
}
Run Code Online (Sandbox Code Playgroud)

但是这个函数给了我结果:

f[cid]=325&f[field_name[10][0]]=133&f[field_name[10][1]]=132&f[price]=320%7C3600
Run Code Online (Sandbox Code Playgroud)

这是错误的,因为我无法在服务器端获得正确的结果:

Array
(
    [f] => Array
        (
            [cid] => 325
            [field_name[10] => Array
                (
                    [0] => 133
                )

            [price] => 320|3600
        )
)
Run Code Online (Sandbox Code Playgroud)

我怎么解决这个问题?我认为正确的结果将是这样的:

f[cid]=325&f[field_name[[10][0]]]=133&f[field_name[[10][1]]]=132&f[price]=320%7C3600
Run Code Online (Sandbox Code Playgroud)

Sci*_*ter 6

为了纠正嵌套的查询字符串,我稍微改变了你的函数:

function toQueryString(obj, prefix) {
    var str = [], k, v;
    for(var p in obj) {
        if (!obj.hasOwnProperty(p)) {continue;} // skip things from the prototype
        if (~p.indexOf('[')) {
            k = prefix ? prefix + "[" + p.substring(0, p.indexOf('[')) + "]" + p.substring(p.indexOf('[')) : p;
// only put whatever is before the bracket into new brackets; append the rest
        } else {
            k = prefix ? prefix + "[" + p + "]" : p;
        }
        v = obj[p];
        str.push(typeof v == "object" ?
          toQueryString(v, k) :
          encodeURIComponent(k) + "=" + encodeURIComponent(v));
    }
    return str.join("&");
}
Run Code Online (Sandbox Code Playgroud)

在原始对象上运行此函数现在为我们提供了此查询字符串:

f[cid]=325&f[field_name][10][0]=133&f[field_name][10][1]=132&f[price]=320|3600
Run Code Online (Sandbox Code Playgroud)

如果我们将其传递给告诉的PHP页面print_r($_GET),它会给我们:

Array
(
    [f] => Array
        (
            [cid] => 325
            [field_name] => Array
                (
                    [10] => Array
                        (
                            [0] => 133
                            [1] => 132
                        )

                )

            [price] => 320|3600
        )

)
Run Code Online (Sandbox Code Playgroud)

你究竟想要什么,对吧?