将字符串点表示法转换为javascript对象

时间:2019-12-17 19:41:49

标签: javascript node.js object formatting

我正在处理一个现有项目,该项目采用奇怪格式的字符串点表示法的查询参数。但是它们必须在处理之前转换为对象。当前正在通过名称对特定键进行条件处理。

如何动态执行此操作?在下面,您将找到输入和所需输出的示例。

输入:

{ 
    date.gte: '2019-01-01', 
    date.lt: '2020-01-01' 
}

输出:

{
    date: {
        gte: '2019-01-01',
        lt: '2020-01-01'
    }
}

3 个答案:

答案 0 :(得分:4)

您可以使用reducesplit方法将每个键拆分为数组,并基于该数组构建嵌套结构。

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