Ramda:将重复数组转换为对象
Ramda : convert duplicate arrays to objects
使用 ramda 转换其中包含重复项的对象数组
var testData = [
{"id" : "001",
"project" : "one",
"projectstartDate" : "10/12/2018"
},{"id" : "001",
"project" : "two",
"projectstartDate" : "10/14/2018"
},{"id" : "002",
"project" : "one",
"projectstartDate" : "10/12/2018"
},{"id" : "002",
"project" : "two",
"projectstartDate" : "10/14/2018"
}
]
需要输出为
{
"001" : {
"one" : {
"projectstartDate" : "10/12/2018"
},
"two" : {
"projectstartDate" : "10/14/2018"
}
},
"002" :{
"one" : {
"projectstartDate" : "10/12/2018"
},
"two" : {
"projectstartDate" : "10/14/2018"
}
}
正在创建以 id 作为键的对象并删除重复项
让我们把它分成几个步骤。
首先,当你有一个列表,你想通过某些功能将它们组合在一起时,像 R.groupBy
can be helpful. In this particular instance you want to group by the id
property, so R.prop('id')
这样的东西可以用作给 R.groupBy
的函数。
const testData = [
{"id" : "001",
"project" : "one",
"projectstartDate" : "10/12/2018"
},{"id" : "001",
"project" : "two",
"projectstartDate" : "10/14/2018"
},{"id" : "002",
"project" : "one",
"projectstartDate" : "10/12/2018"
},{"id" : "002",
"project" : "two",
"projectstartDate" : "10/14/2018"
}
]
console.log(R.groupBy(R.prop('id'), testData))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
一旦你对这些进行了分组,你想转换一个由某个值索引的对象中的列表,这通常是实现 R.indexBy
的好时机。因为我们想要索引与每个分组对象的键关联的每个列表,所以我们需要 R.map
对象。
const testData = {
"001": [
{
"id": "001",
"project": "one",
"projectstartDate": "10/12/2018"
},
{
"id": "001",
"project": "two",
"projectstartDate": "10/14/2018"
}
],
"002": [
{
"id": "002",
"project": "one",
"projectstartDate": "10/12/2018"
},
{
"id": "002",
"project": "two",
"projectstartDate": "10/14/2018"
}
]
}
console.log(
R.map(R.indexBy(R.prop('project')), testData)
)
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
然后我们必须清理嵌套对象中遗留的剩余属性。您在这里有几个选择,即通过使用 R.omit
or which properties you want to keep with R.pick
.
声明要删除的属性
const testData = {
"id" : "001",
"project" : "one",
"projectstartDate" : "10/12/2018"
}
console.log(
R.pick(['projectstartDate'], testData)
)
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
通过管道将它们连接在一起
const testData = [
{"id" : "001",
"project" : "one",
"projectstartDate" : "10/12/2018"
},{"id" : "001",
"project" : "two",
"projectstartDate" : "10/14/2018"
},{"id" : "002",
"project" : "one",
"projectstartDate" : "10/12/2018"
},{"id" : "002",
"project" : "two",
"projectstartDate" : "10/14/2018"
}
]
const fn = R.pipe(
R.groupBy(R.prop('id')),
R.map(R.pipe(
R.indexBy(R.prop('project')),
R.map(R.pick(['projectstartDate']))
))
)
console.log(
fn(testData)
)
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
使用 ramda 转换其中包含重复项的对象数组
var testData = [
{"id" : "001",
"project" : "one",
"projectstartDate" : "10/12/2018"
},{"id" : "001",
"project" : "two",
"projectstartDate" : "10/14/2018"
},{"id" : "002",
"project" : "one",
"projectstartDate" : "10/12/2018"
},{"id" : "002",
"project" : "two",
"projectstartDate" : "10/14/2018"
}
]
需要输出为
{
"001" : {
"one" : {
"projectstartDate" : "10/12/2018"
},
"two" : {
"projectstartDate" : "10/14/2018"
}
},
"002" :{
"one" : {
"projectstartDate" : "10/12/2018"
},
"two" : {
"projectstartDate" : "10/14/2018"
}
}
正在创建以 id 作为键的对象并删除重复项
让我们把它分成几个步骤。
首先,当你有一个列表,你想通过某些功能将它们组合在一起时,像 R.groupBy
can be helpful. In this particular instance you want to group by the id
property, so R.prop('id')
这样的东西可以用作给 R.groupBy
的函数。
const testData = [
{"id" : "001",
"project" : "one",
"projectstartDate" : "10/12/2018"
},{"id" : "001",
"project" : "two",
"projectstartDate" : "10/14/2018"
},{"id" : "002",
"project" : "one",
"projectstartDate" : "10/12/2018"
},{"id" : "002",
"project" : "two",
"projectstartDate" : "10/14/2018"
}
]
console.log(R.groupBy(R.prop('id'), testData))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
一旦你对这些进行了分组,你想转换一个由某个值索引的对象中的列表,这通常是实现 R.indexBy
的好时机。因为我们想要索引与每个分组对象的键关联的每个列表,所以我们需要 R.map
对象。
const testData = {
"001": [
{
"id": "001",
"project": "one",
"projectstartDate": "10/12/2018"
},
{
"id": "001",
"project": "two",
"projectstartDate": "10/14/2018"
}
],
"002": [
{
"id": "002",
"project": "one",
"projectstartDate": "10/12/2018"
},
{
"id": "002",
"project": "two",
"projectstartDate": "10/14/2018"
}
]
}
console.log(
R.map(R.indexBy(R.prop('project')), testData)
)
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
然后我们必须清理嵌套对象中遗留的剩余属性。您在这里有几个选择,即通过使用 R.omit
or which properties you want to keep with R.pick
.
const testData = {
"id" : "001",
"project" : "one",
"projectstartDate" : "10/12/2018"
}
console.log(
R.pick(['projectstartDate'], testData)
)
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
const testData = [
{"id" : "001",
"project" : "one",
"projectstartDate" : "10/12/2018"
},{"id" : "001",
"project" : "two",
"projectstartDate" : "10/14/2018"
},{"id" : "002",
"project" : "one",
"projectstartDate" : "10/12/2018"
},{"id" : "002",
"project" : "two",
"projectstartDate" : "10/14/2018"
}
]
const fn = R.pipe(
R.groupBy(R.prop('id')),
R.map(R.pipe(
R.indexBy(R.prop('project')),
R.map(R.pick(['projectstartDate']))
))
)
console.log(
fn(testData)
)
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>