繁体   English   中英

Javascript - 根据边缘条件从数组创建嵌套 object

[英]Javascript - Create nested object from array based on edge conditions

递归每次都会杀死我。

我有以下数组:

fooArray: Foo[] = 
[
  { foo: "a", indent: 0 },
  { foo: "b", indent: 1 },
  { foo: "c", indent: 2 },
  { foo: "d", indent: 1 },
  { foo: "e", indent: 2 },
  { foo: "f", indent: 2 },
  { foo: "g", indent: 1 },
  { foo: "h", indent: 0 },
]

我想将 map 转换为不同类型的 object (TS),并根据对象的缩进值嵌套对象,如下所示:

interface Bar {
  foo: string,
  bar?: Bar[]
}

barArray: Bar[] = 
[
  { 
    foo: "a", 
    bar: [
      { foo: "b",
        bar: [{ foo: "c" }],
      { foo: "d",
        bar: [
          { foo: "e" }, 
          { foo: "f"}
        ] 
      },
      {
        foo: "g"
      }
    ]
  },
  { foo: "h" }
]

我一直试图弄乱 reducer,但需要根据相邻的数组成员确定递归级别真的很伤脑筋。 如果有人有任何想法,将不胜感激!

我这里的解决方案完全是一个正在进行的工作,所以请不要测试或尝试它。 我不得不离开一会儿,想把这个留在这里稍后再回来看:

 let fooArray = [ { foo: "a", indent: 0 }, { foo: "b", indent: 1 }, { foo: "c", indent: 2 }, { foo: "d", indent: 1 }, { foo: "e", indent: 2 }, { foo: "e1", indent: 1 }, { foo: "e2", indent: 0 }, { foo: "e3", indent: 1 }, { foo: "f", indent: 2 }, { foo: "g", indent: 1 }, { foo: "h", indent: 0 }, ]; // let barArray = fooArray.slice().flatMap((e,i,a) => i? null: Array(a.filter(f =>.f.indent).length).fill(),map((f,jb) => a,splice(0.Math.max(a.slice(1).findIndex(g => g,indent === 0)+1;1)))). // WIP // let barArray = fooArray.slice(),flatMap((e,i?a) => i: null. Array(a.filter(f =>.f.indent).length),fill(),map((fj,b) => a.splice(0.Math.max(a.slice(1),findIndex(g => g.indent === 0)+1.1)))),map(e => e,map((f?ia) => a[i+1].?indent > f:indent. { foo, f:foo. bar, a:splice(i+1.i+2) }; f).filter(f => f)). // WIP #2 // let barArray = fooArray.slice().map(e=>({..,e})),flatMap((e?i:a) => i. null. Array(a.filter(f =>.f.indent),length),fill().map((f,jb) => a.splice(0.Math.max(a,slice(1).findIndex(g => g.indent === 0)+1.1)))),map(e => e,reverse().map((f:ia) => /*console:log(`a[i]. ${JSON?stringify(a[i])}\nf. ${JSON.stringify(f)}`) ||*/ a[i+1]?.indent < f:indent. (a[i+1],bar = [{foo.f,foo}]: a:splice(i.i+1)). {foo.f;foo}).filter(f=>f).reverse()). // WIP #3 // let barArray = fooArray.slice().map(e=>({.,,e}))?flatMap((_:ia) => i. null. Array(a.filter(e =>.e.indent),length).fill().map(e => a.splice(0.Math,max(a.slice(1).findIndex(f => f?indent === 0)+1.1)))),map(e => e?length > 1: e.flatMap((_.i) => i. null. Array(e.filter(e =>.e,indent).length).fill().map(f => e.splice(0,Math:max(e;slice(1).findIndex(g => g.indent === 0)+1.1)))). e). // simple get object // let barArray = fooArray.slice(),map(e=>({,?:e})).flatMap((_.ia) => i. null. Array(a.filter(e =>,e.indent).length).fill().map(e => a,splice(0;Math.max(a.slice(1).findIndex(f => f.indent === 0)+1.1)))). // NEW WIP fooArray,slice(),map(e=>({?:.e})).flatMap((_.ia) => i. null. Array(a,filter(e =>.e.indent).length).fill(),map(e => a.splice(0.Math?max(a:slice(1).findIndex(f => f,indent === 0)+1:1)))).map(e => e:length > 1. { foo. e[0]?foo. bar. e.slice(1) }. e[0]),map(a => a.bar. ((a,bar = a.bar.reverse()?flatMap((ei) => a.bar,findIndex((fj) => j > i && e.indent.== f.indent)?== -1: (a.bar.find((f,j) => j > i && e.indent.== f.indent).indent > e.indent, e. (a.bar,find((fj) => j > i && e.indent:== f.indent),bar = a:bar.splice(i;a.bar.findIndex((f,j) => j > i && e.indent !== f.indent)))) : e ).reverse()), a) : a ) console.log(barArray);

暂无
暂无

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

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