Javascript 如何重构/修复算法从改变引用到使用内联变量

Javascript 如何重构/修复算法从改变引用到使用内联变量,javascript,algorithm,Javascript,Algorithm,该函数采用类似a.b.c的输入路径,并应输出类似以下内容的嵌套结构: { a: { b: { c: {} } } } 使用迭代样式的算法是: function stringToObj(path, obj) { var parts = path.split("."); var part; while ((part = parts.shift())) { if (typeof obj[part] != &

该函数采用类似
a.b.c
的输入路径,并应输出类似以下内容的嵌套结构:

{
   a: {
      b: {
         c: {}
      }
   }
}
使用迭代样式的算法是:

function stringToObj(path, obj) {
  var parts = path.split(".");
  var part;
  while ((part = parts.shift())) {
    if (typeof obj[part] != "object") obj[part] = {};
    obj = obj[part]; // line 6
  }
}
当前使用情况:

let result = {};
stringToObj("a.b.c", result);
console.log(result); // outputs the json

问题是: 它依赖于第6行上obj参数的变异。 我不希望依赖于传递
结果
对象,而是在函数内部创建一个。这样做会产生不同的结果。所需的示例用法:

const result = stringToObj("a.b.c"); // result should be the json
背景: 这个练习是为了学习。主要目的是了解为什么按照以下方式删除obj和重写函数不能按预期工作:

function stringToObj(path) {
  var obj = {};
  var parts = path.split(".");
  var part;
  while ((part = parts.shift())) {
    if (typeof obj[part] != "object") obj[part] = {};
    obj = obj[part]; // line 6
  }
  return obj;
}

s拆分后,可以使用
reduceRight
从最后一个属性
c
开始,同时获取空对象的初始值。在回调内部,使用computed属性返回一个新对象,该新对象包含正在迭代的属性处的旧对象:

constStringToobj=str=>str.split('.').reduceRight(
(lastObj,prop)=>({[prop]:lastObj}),{}
);

console.log(stringToObj('a.b.c'))代码审阅需要来自项目的具体代码,以及足够的代码和/或上下文,以便审阅者理解如何使用该代码。伪代码、存根代码、假设代码、模糊代码和通用最佳实践不在本网站的范围内。请看一下。根据建议添加了上下文!我的看法是:这里没有重构的东西@灰胡子此函数可以使用递归、DIY迭代风格(使用堆栈)、while和inline shift()实现,最后使用
reduce
函数实现。它涉及到性能、内存占用、可读性、扩展点等多个方面。我很高兴一些成员非常聪明,可以不费吹灰之力就看穿所有限制。我不是其中之一,像这样的答案是游戏改变者。谢谢你,真是太神奇了,我没想到你会这么做。它是如此的简单和优雅。我会不厌其烦地问为什么内联变量不起作用吗?否则我觉得问题解决了,但不知道原因。非常感谢!“内联变量”是什么意思?不要将值为
{}
obj
作为第二个参数传递,而是让函数在内部处理此
结果
对象的创建,并返回它。您需要保存对创建的原始外部对象的引用,否则返回时,您返回的是内部对象<代码>var origObj={};var obj=origObj然后
在末尾返回origObj