我正在处理一个现有项目,该项目采用奇怪格式的字符串点表示法的查询参数。但是它们必须在处理之前转换为对象。当前正在通过名称对特定键进行条件处理。
如何动态执行此操作?在下面,您将找到输入和所需输出的示例。
输入:
{
date.gte: '2019-01-01',
date.lt: '2020-01-01'
}
输出:
{
date: {
gte: '2019-01-01',
lt: '2020-01-01'
}
}
答案 0 :(得分:4)
您可以使用reduce
和split
方法将每个键拆分为数组,并基于该数组构建嵌套结构。
const data = {
'date.gte': '2019-01-01',
'date.lt': '2020-01-01'
}
const result = Object.entries(data).reduce((r, [k, v]) => {
k.split('.').reduce((a, e, i, ar) => {
return a[e] || (a[e] = ar[i + 1] ? {} : v)
}, r)
return r;
}, {})
console.log(result)
答案 1 :(得分:1)
您说“格式异常的字符串点表示法”是指"date.gte"
和"date.lt"
const input = {
"date.gte": "2019-01-01",
"date.lt": "2020-01-01"
};
const res = Object.keys(input).reduce(
(result, current) => {
const [, operator] = current.split(".");
result.date[operator] = input[current];
return result;
},
{ date: {} }
);
console.log(res);
答案 2 :(得分:1)
这是Dan的答案的一种改进,它不依赖于了解原始对象中的键值对。内纳德(Nenad)的答案不胜枚举,但我为此花了很长时间才把它贴出来:)
const formatter = (weirdObject, s = '.') => Object.keys(weirdObject).reduce((acc, cur) => {
const [parent, child] = cur.split(s);
if (!acc[parent]) acc[parent] = {};
acc[parent][child] = weirdObject[cur];
return acc;
}, {});
// -- Demonstration:
const input1 = {
"date.gte": "2019-01-01",
"date.lt": "2020-01-01"
};
const input2 = {
"person:name": "Matt",
"person:age": 19
};
const res1 = formatter(input1);
const res2 = formatter(input2, ':');
console.log(res1);
console.log(res2);