繁体   English   中英

棘手的对象展平

[英]Tricky object flattening

我真的不想重新发明自行车,所以当您拥有这样的对象时,也许有人已经遇到过这种情况:

{
   a: {
      site1: {
         type1: {
            item1: 42,
            item2: 13
         }
      },
      site2: {
         type2: {
            item3: 35
         }
      }
   }
}

你需要把它放到一个数组中:

[
   [ a, site1, type1, 42],
   [ a, site1, type1, 13],
   [ a, site2, type2, 35]
]

您需要通过树递归:

const data = {
  a: {
    site1: {
      type1: {
        item1: 42,
        item2: 13,
      },
    },
    site2: {
      type2: {
        item3: 35,
      },
    },
  },
};

function walk(data, out, path = []) {
  Object.keys(data).forEach(key => {
    const newPath = [...path, key];
    const value = data[key];
    if (typeof value === "object") {
      walk(value, out, newPath);
    } else {
      out.push([newPath, value]);
      // Or if you really don't need the value...
      //out.push(newPath);
    }
  });
}

const out = [];
walk(data, out);
console.log(out);

产出

[
  [ [ 'a', 'site1', 'type1', 'item1' ], 42 ],
  [ [ 'a', 'site1', 'type1', 'item2' ], 13 ],
  [ [ 'a', 'site2', 'type2', 'item3' ], 35 ]
]

通过更改注释掉的那一行,您可以获得原始所需的结果,而无需这些值。

这是一个更简单的解决方案:

function flattenObject(objToFlat, path = []) {
  return Object.keys(objToFlat).reduce(
    (result, key) => [
      ...result,
      ...(typeof objToFlat[key] === 'object'
        ? flattenObject(objToFlat[key], [...path, key])
        : [[...path, objToFlat[key]]]),
    ],
    []
  );
}

请注意,您不需要将空数组传递给函数。

您可以在此 plunker 中测试解决方案: http ://plnkr.co/edit/IM5v3fyAMrfV5HKS?open=lib%2Fscript.js

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM