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

时间:2020-08-10 02:59:27

标签: javascript

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

[['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;
};

我感谢您的反馈。

2 个答案:

答案 0 :(得分:2)

诀窍是检查给定属性的value是否是array。如果是,请在value上再次调用该函数,否则按原样使用value

这是使用Array.prototype.reduce的版本。

const a = [['a', 1], ['b', 2], ['c', [['d', 4]]]];

const o = arrayToObject(a);
console.log(o);

function arrayToObject(a) {
  return a.reduce((o, [k, v]) => Object.assign(o, {
   [k]: Array.isArray(v) ? arrayToObject(v) : v,
  }), {});
}

通过Object.assign函数,您可以将一个或多个对象的属性附加到目标对象上。

在下面的示例中,对象b的属性将附加到对象a上,并返回a。因此ac是同一对象。

const a = { a: 'A' };
const b = { b: 'B' };
const c = Object.assign(a, b);

console.log(a, c, a === c);

三元运算符是简写的if语句。在函数中,它正在检查v是否为数组。如果是,则将数组值再次传递给函数,以启动递归调用。

它可以被重写:

if (Array.isArray(v)) {
    return arrayToObject(v);
} else {
    return v;
}

答案 1 :(得分:1)

您只需要一个循环,对于value,请检查您是否拥有该循环,如果是数组,则进行递归。

const deepArrayToObject = function(arr) {
  let obj = {};

  // This does nothing useful
  //  if (arr !== []) {
  //    return obj;
  //  }

  for (let i = 0; i < arr.length; i++) {
    let key = arr[i][0];
    let value = arr[i][1];
    
    if (Array.isArray(value)) {
      obj[key] = deepArrayToObject(value);
    } else {
      obj[key] = value;
    }
  }
  return obj;
};

const a = [['a', 1], ['b', 2], ['c', [['d', 4]]]];

const res = deepArrayToObject(a);

console.log(res);