使用 Ramda 映射和深层对象
map and deep object with Ramda
我需要按 "segments" 属性进行过滤,在这种情况下,我需要按段进行过滤:[name: "general]
我有以下数组
const lines = [{
id: 1191,
name: "dev",
segments: []
},
{
id: 1192,
name: "credit",
folder: "Embarazadas",
segments: [{
"name": "general",
},
{
"name": "custom",
}
]
},
{
id: 1311,
name: "box",
segments: [{
"name": "custom",
"line_id": 1431,
"id": 21,
"active": true
}]
},
{
id: 2000,
name: "sin folder",
folder: null,
segments: [{
"name": "custom",
},
{
"name": "general",
}
],
},
{
id: 2000,
name: "credit card",
segments: [{
"name": "general",
}],
},
]
我需要获取段为 "general"
的所有对象
我尝试用 Ramda 这样做但我没有得到结果,首先我做了一个线条图,然后是一个过滤器。
问题是有时段属性到达空
const filterLinesBySegments = (lines) => {
const filter = (line) => {
const hasSegments =R.filter(seg => seg["name"] === "general")(line.segments)
const newLine = R.compose(
R.assoc("segments", hasSegments),
)(line)
return newLine
}
const new= R.map(item => {
return R.filter(line => {
return filter(line)
})(item)
})(lines)
return new;
}
要仅保留具有一般段的行,您可以使用 R.filter,并使用 R.where 按特定 属性 进行过滤。由于 segments
是一个数组,因此使用 R.any 搜索某些对象是否具有 general
.
的 name
要从细分中删除自定义,您可以进化对象的细分,并拒绝所有带有 name: custom
的项目。
const { filter, where, any, propEq, reject, evolve, pipe, map } = R
const filterLinesBySegments = filter(where({
segments: any(propEq('name', 'general'))
}))
const filterCustomFromSegments = evolve({
segments: reject(propEq('name', 'custom'))
})
const fn = pipe(
filterLinesBySegments,
map(filterCustomFromSegments),
)
const lines = [{"id":1191,"name":"dev","segments":[]},{"id":1192,"name":"credit","folder":"Embarazadas","segments":[{"name":"general"},{"name":"custom"}]},{"id":1311,"name":"box","segments":[{"name":"custom","line_id":1431,"id":21,"active":true}]},{"id":2000,"name":"sin folder","folder":null,"segments":[{"name":"custom"},{"name":"general"}]},{"id":2000,"name":"credit card","segments":[{"name":"general"}]}]
const result = fn(lines)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js"></script>
我需要按 "segments" 属性进行过滤,在这种情况下,我需要按段进行过滤:[name: "general]
我有以下数组
const lines = [{
id: 1191,
name: "dev",
segments: []
},
{
id: 1192,
name: "credit",
folder: "Embarazadas",
segments: [{
"name": "general",
},
{
"name": "custom",
}
]
},
{
id: 1311,
name: "box",
segments: [{
"name": "custom",
"line_id": 1431,
"id": 21,
"active": true
}]
},
{
id: 2000,
name: "sin folder",
folder: null,
segments: [{
"name": "custom",
},
{
"name": "general",
}
],
},
{
id: 2000,
name: "credit card",
segments: [{
"name": "general",
}],
},
]
我需要获取段为 "general"
的所有对象我尝试用 Ramda 这样做但我没有得到结果,首先我做了一个线条图,然后是一个过滤器。 问题是有时段属性到达空
const filterLinesBySegments = (lines) => {
const filter = (line) => {
const hasSegments =R.filter(seg => seg["name"] === "general")(line.segments)
const newLine = R.compose(
R.assoc("segments", hasSegments),
)(line)
return newLine
}
const new= R.map(item => {
return R.filter(line => {
return filter(line)
})(item)
})(lines)
return new;
}
要仅保留具有一般段的行,您可以使用 R.filter,并使用 R.where 按特定 属性 进行过滤。由于 segments
是一个数组,因此使用 R.any 搜索某些对象是否具有 general
.
name
要从细分中删除自定义,您可以进化对象的细分,并拒绝所有带有 name: custom
的项目。
const { filter, where, any, propEq, reject, evolve, pipe, map } = R
const filterLinesBySegments = filter(where({
segments: any(propEq('name', 'general'))
}))
const filterCustomFromSegments = evolve({
segments: reject(propEq('name', 'custom'))
})
const fn = pipe(
filterLinesBySegments,
map(filterCustomFromSegments),
)
const lines = [{"id":1191,"name":"dev","segments":[]},{"id":1192,"name":"credit","folder":"Embarazadas","segments":[{"name":"general"},{"name":"custom"}]},{"id":1311,"name":"box","segments":[{"name":"custom","line_id":1431,"id":21,"active":true}]},{"id":2000,"name":"sin folder","folder":null,"segments":[{"name":"custom"},{"name":"general"}]},{"id":2000,"name":"credit card","segments":[{"name":"general"}]}]
const result = fn(lines)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js"></script>