微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将嵌套对象虚拟中的项目拉入父对象数组

如何解决将嵌套对象虚拟中的项目拉入父对象数组

我想使用这个对象数组,其中一些对象包含类似架构的数组,并创建一个新数组,它们都在同一级别。

[
  {
   "name": "United States","slug": "united-states","states":[
     {
      "name": "Arizona","slug": "arizona"
     },{
      "name": "California","slug": "california"
     }
    ]
  },{
   "name": "Canada","slug": "canada",}

]

这应该是最终结果:

[
  {
   "name": "United States","slug": "united-states"
  },{
   "name": "Arizona","slug": "arizona"
  },{
   "name": "California","slug": "california"
  },}

]

解决方法

使用 Array#flatMap

const data = [
  {
    "name": "United States","slug": "united-states","states":[
      { "name": "Arizona","slug": "arizona" },{ "name": "California","slug": "california" }
    ]
  },{ "name": "Canada","slug": "canada" }
];

const res = data.flatMap(({ name,slug,states = [] }) => ([
  { name,slug },...states
]));

console.log(res);

,

您可以创建一个迭代器来遍历树,然后将其消耗到数组中。这适用于更深的嵌套级别,并且不需要知道哪个属性具有子记录。它假设具有 Array 值的属性持有子树:

function * traverse(forest) {
    for (const item of forest) {
        const arrayKey = Object.entries(item).find(([k,v]) => Array.isArray(v))?.[0];
        const { [arrayKey]: children,...rest } = item;
        yield rest;
        if (children) yield * traverse(children);
    }
}

const data = [{"name": "United States","states":[{ "name": "Arizona","slug": "california" }]},"slug": "canada" }];

const res = [...traverse(data)];

console.log(res);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。