【发布时间】:2018-04-01 09:50:59
【问题描述】:
循环可能是错误的术语,但它描述了我正在尝试的内容。 我想为平面数据提供结构,但我还需要跟踪它来自的数组。
基本上我的规则是(每个数组):
如果级别 1 存在 - 给它项目的
name和一个typechild数组。每次出现级别 1 时(即使在同一个数组中),它都应该创建一个新条目。在
typechild里面,放任何等级>1的物品如果不存在 1 级 - 将项目的
name和typechild数组给它。
我下面的代码几乎在那里,除了它应该在每次看到级别 1 时创建一个数组。我的示例将有意义:
输入数据
[
{
"title": "Test 1",
"type": [{
"name": "Animal",
"level": 1
},
{
"name": "Food",
"level": 1
},
{
"name": "Chicken",
"level": 3
}
]
},
{
"title": "Test 2",
"type": [{
"name": "Foo",
"level": 2
}]
}
]
注意:动物和食物都是 1 级项目。所以它应该像这样创建两个数组......
期望的输出
[
{
name: "Animal",
typechild: [
{
level: 2,
name: "Chicken"
}
]
},
{
name: "Food",
typechild: [
{
level: 2,
name: "Chicken"
}
]
},
{
name: "NoName",
typechild: [
{
level: 2,
name: "Foo"
}
]
}
]
Ramda 尝试(在这里尝试:https://dpaste.de/JQHw):
const levelEq = (n) => pipe(prop('level'), equals(n));
const topLevel = pipe(prop('type'), find(levelEq(1)));
const topLevelName = pipe(topLevel, propOr('NoName', 'name'));
const extract2ndLevel = pipe(pluck('type'), flatten, filter(levelEq(2)));
const convert = pipe(
groupBy(topLevelName),
map(extract2ndLevel),
map(uniq),
toPairs,
map(zipObj(['name', 'typechild']))
);
【问题讨论】:
-
为什么
Chicken是2级?NoName来自哪里?
标签: javascript arrays filter reduce ramda.js