2

私が解決しようとしている非常にユニークな問題があります。

次のシリアル化されたクエリ文字列があります。

a=a2&b.c=c2&b.d.e=e2&b.d.f=f2

次のオブジェクト object にデシリアライズされます:

{
    a: "a2", 
    b.c: "c2", 
    b.d.e: "e2", 
    b.d.f: "f2"
}

次のパーサーを使用します (フラットなオブジェクトでうまく機能します!)

function parse(string){
    string = 
    '{"' +  //root
        string
            .replace(/&/g, '","') //replace '&' with ','
            .replace(/=/g,'":"')+ //replace '=' with ':'\
    '"}'; //close root


return JSON.parse(string,function(key, value){ //handle URI issues

        var ret;

        if(key===""){ //null key means that we have something wrong with the encoding, probably escaped shit
            ret = value;
        }
        else{
            ret = decodeURIComponent(value); //decode escaped stuff
        }
        return ret;

});

}

.これは、次のように、キー内の表記を表す多次元オブジェクトに解析する必要があります。

{
    a:"a2",
    b:{
        c: "c2",
        d:{
            e:"e2",
            f:"f2"
        }
    }
}

ここでの助けは素晴らしいでしょう。私はこれを過去数時間の形に再帰しようとしてきましたが、私の脳はバラバラになり、解決策に喜びはありません.

N 次元の JavaScript オブジェクトを URI に解析してから JavaSCript オブジェクトに戻す別の方法 (2 つの関数) がある場合、私はすべて耳にします。

4

2 に答える 2

1

JavaScript オブジェクトをシリアライズして URL エンコードすることもできます。同様の質問に対するこの回答を参照してください: JSON をクエリ文字列にシリアライズする標準化された方法?

于 2013-09-06T07:32:20.400 に答える
0

私は野生で同じ問題に遭遇しました。これが私が思いついたものです:

const queryToObject = (query) => {

    return query.split('&').reduce((result, entry) => {
        const [k, v] = entry.split('=')
        const keys = k.split('.')
        let key = 'result', value = `'${v}'`
        for (i = 0; i < keys.length; i++) {
            key += `['${keys[i]}']`
            if (i == keys.length - 1) eval(key + '=' + value)
            else if (!eval(key)) eval(key + '= {}')
        }
        return result
    }, {})

}

const recursiveQueryToObject = (query) => {

    const helper = (keys, value, nth) => {
        const key = keys.shift()
        if (!keys.length) return { [key]: value }
        else return { [key]: { ...nth[key], ...helper(keys, value, nth[key] || {}) } }
    }

    return query.split('&').reduce((result, entry) => {
        const [k, value] = entry.split('=')
        const keys = k.split('.')
        const key = keys.shift()
        result[key] = keys.length ? { ...result[key], ...helper(keys, value, result[key] || {}) } : value
        return result
    }, {})

}
于 2021-03-24T22:17:57.323 に答える