Javascript 如何使用递归将深嵌套数组转换为深嵌套对象?

Javascript 如何使用递归将深嵌套数组转换为深嵌套对象?,javascript,Javascript,我正在尝试创建一个函数来转换如下数组: [['a', 1], ['b', 2], ['c', [['d', 4]]]] { a: 1, b: 2, c: { d: 4 } } 变成这样一个物体: [['a', 1], ['b', 2], ['c', [['d', 4]]]] { a: 1, b: 2, c: { d: 4 } } 到目前为止,我只是有一个将正则数组转换为正则对象的函数,我已经掌握了递归的窍门,我只是不知道在这种情况下如何实现它。以下是我正在使用的函数: const dee

我正在尝试创建一个函数来转换如下数组:

[['a', 1], ['b', 2], ['c', [['d', 4]]]]
{ a: 1, b: 2, c: { d: 4 } }
变成这样一个物体:

[['a', 1], ['b', 2], ['c', [['d', 4]]]]
{ a: 1, b: 2, c: { d: 4 } }
到目前为止,我只是有一个将正则数组转换为正则对象的函数,我已经掌握了递归的窍门,我只是不知道在这种情况下如何实现它。以下是我正在使用的函数:

const deepArrayToObject = function(arr) {
  let obj = {};
  if (arr !== []) {
    return obj;
  }
  for (let i = 0; i < arr.length; i++) {
    for (let j = 0; j < arr[i].length; j++) {
      let key = arr[i][0];
      let value = arr[i][1];
      obj[key] = value;
    }
  }
  return obj;
};

感谢您的反馈。

关键在于检查给定属性的值是否为数组。如果是,请再次调用该值的函数,否则按原样使用该值

这是一个使用Array.prototype.reduce的版本

常数a=[[a',1],[b',2],[c',[d',4]]; 常数o=阵列对象a; 控制台标志; 函数arrayToObjecta{ 返回a.reduceo[k,v]=>Object.assigno{ [k] :Array.isArrayv?arrayTobObjectv:v, }, {};
} 诀窍是检查给定属性的值是否为数组。如果是,请再次调用该值的函数,否则按原样使用该值

这是一个使用Array.prototype.reduce的版本

常数a=[[a',1],[b',2],[c',[d',4]]; 常数o=阵列对象a; 控制台标志; 函数arrayToObjecta{ 返回a.reduceo[k,v]=>Object.assigno{ [k] :Array.isArrayv?arrayTobObjectv:v, }, {};
} 您只需要一个循环,对于该值,检查您有哪些循环,如果它是数组,则执行递归

const deepArrayToObject=functionarr{ 设obj={}; //这毫无用处 //如果arr!=[]{ //返回obj; // } 对于let i=0;iconsole.logres 您只需要一个循环,对于该值,检查您有哪些循环,如果它是数组,则执行递归

const deepArrayToObject=functionarr{ 设obj={}; //这毫无用处 //如果arr!=[]{ //返回obj; // } 对于let i=0;iconsole.logres;我刚刚注意到有些数组是双重包装的,比如:[[d',4]]。这是故意的吗?我刚刚注意到有些数组是双重包装的,比如:[[d',4]]。这是故意的吗?一个小提示-在reduce的每次迭代中都会创建一个新对象。更有效的办法是就地修改。o、 [k,v]=>{o[k]=…;return o;}Object.assign实际上返回指定为第一个参数的目标对象,因此它每次都在修改现有对象,而不是创建新对象。有关更多信息,请参阅。这是一个展示,不用担心。我确实需要再次检查以确保:太棒了,谢谢你的建议,效果很好!我觉得我可能需要这个阵列。你能用三元运算符为我分解object.assign的用法吗?我想我明白了,但如果能对它有更深入的了解那就太好了。我还检查了MDN,因为它对我来说是比较新的。再次感谢。我添加了一个扩展的解释。这更有意义吗?一个小提示-在reduce的每次迭代中都会创建一个新对象。更有效的办法是就地修改。o、 [k,v]=>{o[k]=…;return o;}Object.assign实际上返回指定为第一个参数的目标对象,因此它每次都在修改现有对象,而不是创建新对象。有关更多信息,请参阅。这是一个展示,不用担心。我确实需要再次检查以确保:太棒了,谢谢你的建议,效果很好!我觉得我可能需要这个阵列。你能用三元运算符为我分解object.assign的用法吗?我想我明白了,但如果能对它有更深入的了解那就太好了。我还检查了MDN,因为它对我来说是比较新的。再次感谢。我添加了一个扩展的解释。这更有意义吗?谢谢你!作品完美且易于初学者掌握:。我有一种感觉,我离这里只有几步之遥。我忘了删除你注释掉的那个条件,因为我在休息后才开始处理它,并补充说作为一个开始,然后认为这不是正确的方法,我应该得到一些帮助!再次谢谢你,谢谢你!作品完美且易于初学者掌握:。我有一种感觉,我离这里只有几步之遥。我忘了删除您注释掉的那个条件,因为我在休息后才开始处理它,并添加了它作为一个开始,然后思考 那不是正确的方法,我应该得到一些帮助!再次感谢。