javascript - Javascript - 根据边缘条件从数组创建嵌套对象
问题描述
递归每次都会杀死我。
我有以下数组:
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 },
]
我想将此映射到不同类型的对象(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,j,b) => 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((f,j,b) => a.splice(0,Math.max(a.slice(1).findIndex(g => g.indent === 0)+1,1)))).map(e => e.map((f,i,a) => 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,j,b) => a.splice(0,Math.max(a.slice(1).findIndex(g => g.indent === 0)+1,1)))).map(e => e.reverse().map((f,i,a) => /*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((_,i,a) => 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((_,i,a) => 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((_,i,a) => 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((e,i) =>
a.bar.findIndex((f,j) => 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((f,j) => 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);
推荐阅读
- docker - docker 中的 Couchbase 进行集成测试:使端口 8092、8093、8094 和 8095 可配置以能够使用 docker 的随机端口
- javascript - 将 setTimeout 添加到 Promise.all
- javascript - 原型和关闭
- mercurial - 如何让 hg diff 显示已修改或添加的行,但不显示已删除的行?
- python-3.x - 如何从 numpy 数组创建视频而不循环?
- c++ - 为什么使用指针而不是直接实例化对象时不采用类成员的默认值?
- javascript - Util.spawnCommandLine 不适用于 GNOME Shell 扩展
- java - 防止用户点击同一个按钮?
- css - CSS“inverse border-radius”在元素边界框外创建手机刘海设计
- visual-studio - 将 Visual Studio 2019 克隆到 github 上的私有存储库的真正解决方案