如何将包含对象路径和值的字符串转换为对象?

How can I convert a string containing object paths and values to an object?

我想将 'a|b|c', val1'a|d', val2 形式的字符串转换为 {a: {b : {c : 'val1'}, d: 'val2'}} 形式的嵌套对象。我尝试了以下 -

const path2Obj = (path, value) => {
  const obj = {};
  const pathComps = path.split('|').reverse();
  pathComps.forEach((comp, ind) => {
    if (ind) {
      obj[comp] = obj;
    } else {
      obj[comp] = value;
    }
  });
  return obj;
};
console.log(path2Obj('a|b|c', 'val1'));

但它记录 <ref *1> { c: 'val1', b: [Circular *1], a: [Circular *1] }。有什么想法吗?

我的问题的背景

我正在将其结构在运行前未知的嵌套对象存储到 redis database. Redis does not appear to support nested objects natively so I first convert the them to path / value pairs of strings and save them as hashes。这可行,但我需要一种方法将它们转换回对象

您基本上可以使用 reduce,遍历您使用 split 创建的路径数组,然后 return 对象中的值(如果存在),否则添加值 (新的嵌套对象或值参数)。

const obj = {}

const path2Obj = (path, value, obj) => {
  path.split('|').reduce((r, e, i, arr) => {
    return r[e] || (r[e] = i === arr.length - 1 ? value : {})
  }, obj)
};

path2Obj('a|b|c', 'val1', obj)
path2Obj('a|d', 'val2', obj)

console.log(obj)