将javascript点符号对象转换为嵌套对象

新手上路,请多包涵

我正在尝试构建一个可以扩展对象的函数,例如:

 {
    'ab.cd.e' : 'foo',
    'ab.cd.f' : 'bar',
    'ab.g' : 'foo2'
}

进入嵌套对象:

 {ab: {cd: {e:'foo', f:'bar'}, g:'foo2'}}

像这个 php 函数: Set::expand()

当然不使用 eval 。

原文由 Olivier 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 549
2 个回答

我相信这就是你所追求的:

 function deepen(obj) {
  const result = {};

  // For each object path (property key) in the object
  for (const objectPath in obj) {
    // Split path into component parts
    const parts = objectPath.split('.');

    // Create sub-objects along path as needed
    let target = result;
    while (parts.length > 1) {
      const part = parts.shift();
      target = target[part] = target[part] || {};
    }

    // Set value at end of path
    target[parts[0]] = obj[objectPath]
  }

  return result;
}

// For example ...
console.log(deepen({
  'ab.cd.e': 'foo',
  'ab.cd.f': 'bar',
  'ab.g': 'foo2'
}));

原文由 broofa 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果您使用的是 Node.js(例如 - 如果没有从我们的模块中剪切和粘贴),请尝试这个包: https ://www.npmjs.org/package/dataobject-parser

构建了一个执行正向/反向操作的模块:

https://github.com/Gigzolo/dataobject-parser

它现在被设计为一个自我管理的对象。通过实例化 DataObjectParser 的实例来使用。

 var structured = DataObjectParser.transpose({
    'ab.cd.e' : 'foo',
    'ab.cd.f' : 'bar',
    'ab.g' : 'foo2'
});

structured.data() 返回你的嵌套对象:

{ab: {cd: {e:'foo', f:'bar'}, g:'foo2'}}

所以这是 JSFiddle 中的一个工作示例:

http://jsfiddle.net/H8Cqx/

原文由 Henry Tseng 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题