javascript 将具有父子关系的对象数组转换为嵌套对象

scyqe7ek  于 2023-04-10  发布在  Java
关注(0)|答案(2)|浏览(188)

假设我有下面的对象数组,它们具有父子关系:

[
  { A1: [ "B1" ] },
  { B1: [ "C11", "C12", "C13" ] },
  { C11: [ "D100", "D111", "D112", "D113", "D131" ] },
  { D100: [ "E1000", "E1100" ] }
]

如何将上面的数组转换为嵌套对象来表示关系?因此目标对象将是:

{
A1: 
{
    B1:
    {
        C11: 
        {
            D1000: ["E1000", "E1100"],
            D111: [],
            D112: [],
            D113: [],
            D131: []
        },
        C12: [],
        C13: []
    }
}

}
我用reduce等方法尝试了几种递归方法,但仍然很难正确转换所有级别。

ovfsdjhp

ovfsdjhp1#

假设一个对象有相同的模式,你可以用一个对象引用嵌套对象。
如果你想得到不同的值,比如数组而不是对象,你可以在inout数据中指定。

const
    data = [{ A1: ["B1"] }, { B1: ["C11", "C12", "C13"] }, { C11: ["D100", "D111", "D112", "D113", "D131"] }, { D100: ["E1000", "E1100"] }],
    result = data.reduce((r, o) => {
        Object
            .entries(o)
            .forEach(([k, a]) => a.forEach(l => (r[k] || r._)[l] ??= r[l] = {}));
        return r;
    }, { _: {} });

console.log(result._);
.as-console-wrapper { max-height: 100% !important; top: 0; }
vlju58qv

vlju58qv2#

你可以使用递归来实现你想要的结果。也许我的例子有点笨拙,但它确实做到了:

const array = [
  { A1: [ "B1" ] },
  { B1: [ "C11", "C12", "C13" ] },
  { C11: [ "D100", "D111", "D112", "D113", "D131" ] },
  { D100: [ "E1000", "E1100" ] }
]

// building a structure of objects

const result = array.reduce((prev, current) => {
  Object.entries(current).map(([key, value]) => {
    if (value) {
      prev[key] = {};
      value.map(el => prev[key][el] = {});
    }
  });
  return prev;
}, {})

// loop and represent relations

Object.values(result).map(value => {
  if (Object.keys(value).length) {
    represent(value, result);
  }
})

function represent(value, obj) {
  Object.keys(value).map(key => {
    if (obj[key]) {
      value[key] = { ...obj[key] };
      delete(obj[key]);
      represent(value[key], obj);
    }
  })
}

// convert and associate empty objects to array

associate(result);

function associate(obj) {
  Object.entries(obj).map(([key, value]) => {
    const values = Object.values(value).filter(o => Object.keys(o).length);
    if(values.length){
      associate(value)
    }else{
      if(Object.keys(value).length === 1) {
        obj[key] = [];
      }else {
        obj[key] = Object.keys(value);
      }
    }
  });
}

console.log(JSON.stringify(result, null, 2));

相关问题