gpt4 book ai didi

Javascript:递归编码和解码查询字符串。 (对象到查询字符串,查询字符串到对象)

转载 作者:行者123 更新时间:2023-12-05 04:38:23 26 4
gpt4 key购买 nike

我想将复杂的 json/javascript 对象编码为标准查询字符串编码。我想将此查询字符串解码回 json/javascript 对象。它应该是递归的,包括数组、对象、字符串、 bool 值和数字。

我认为这应该很容易,但事实证明是错误的。有谁知道如何解决这个问题?使用 Javascript 或最好使用 Typescript。

最佳答案

我认为,您想要做的是对嵌套 对象进行编码和解码。

没有单一的标准,但通常使用 QS(查询字符串)语法:

{
"attribute": "value",
"array": ["apples", "bananas"],
"object": { "number": 55 },
}

将变成:

?attribute=value&array[0]=apples&array[1]=bananas&object[number]=55

示例代码:

function decode(querystring: string): object {
function parseValue(value: string): any {
if (value === 'TRUE') return true;
if (value === 'FALSE') return false;
return isNaN(Number(value)) ? value : Number(value);
}

function dec(list: any[], isArray = false): object {
let obj: any = isArray ? [] : {};

let recs: any[] = list.filter((item) => {
if (item.keys.length > 1) return true;
obj[item.keys[0]] = parseValue(item.value);
});

let attrs = {};
recs.map((item) => {
item.key = item.keys.shift();
attrs[item.key] = [];
return item;
}).forEach((item) => attrs[item.key].push(item));

Object.keys(attrs).forEach((attr) => {
let nextKey = attrs[attr][0].keys[0];
obj[attr] = dec(attrs[attr], typeof nextKey === 'number');
});

return obj;
}

return dec(
querystring
.split('&')
.map((item) => item.split('=').map((x) => decodeURIComponent(x)))
.map((item) => {
return {
keys: item[0]
.split(/[\[\]]/g)
.filter((n) => n)
.map((key) => (isNaN(Number(key)) ? key : Number(key))),
value: item[1],
};
})
);
}

export function encode(object: object): string {
function reducer(obj, parentPrefix = null) {
return function (prev, key) {
const val = obj[key];
key = encodeURIComponent(key);
const prefix = parentPrefix ? `${parentPrefix}[${key}]` : key;

if (val == null || typeof val === 'function') {
prev.push(`${prefix}=`);
return prev;
}

if (typeof val === 'boolean') {
prev.push(`${prefix}=${val.toString().toUpperCase()}`);
return prev;
}

if (['number', 'string'].includes(typeof val)) {
prev.push(`${prefix}=${encodeURIComponent(val)}`);
return prev;
}

prev.push(
Object.keys(val).reduce(reducer(val, prefix), []).join('&')
);
return prev;
};
}

return Object.keys(object).reduce(reducer(object), []).join('&');
}

关于Javascript:递归编码和解码查询字符串。 (对象到查询字符串,查询字符串到对象),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70614237/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com