const censusMembers = Object.freeze([
{
id: 1,
name: 'Bob'
}, {
id: 2,
name: 'Sue'
}, {
id: 3,
name: 'Mary',
household_id: 2
}, {
id: 4,
name: 'Elizabeth',
household_id: 6
}, {
id: 5,
name: 'Tom'
}, {
id: 6,
name: 'Jill'
}, {
id: 7,
name: 'John',
household_id: 6
}
]);
在此数组中,可以通过family_id的存在来确定A依存关系。 family_id是对该成员所依赖的雇员的ID的引用(在人口普查成员列表中,“ Mary”是对“ Sue”的依赖)
如何构建一个接受ID和成员(普查成员)数组并返回属于该ID的用户的所有依赖项的函数。
如果id是一个依赖项,或者不在censusMember数组中,则该函数应返回null。
如果没有依赖项,则该函数应返回一个空的错误。
例如:
如果我输入为id 6 然后输出应该是
[
{"id":4,"name":"Elizabeth","household_id":6},
{"id":7,"name":"John","household_id":6}
]
答案 0 :(得分:1)
以下代码似乎可以满足您的要求:
const {curry, find, propEq, has, filter} = R
const householdMembers = curry((census, id) => {
const person = find(propEq('id', id), census);
return person
? has('household_id', person)
? null
: filter(propEq('household_id', id), census)
: null
})
var censusMembers = Object.freeze([
{id: 1, name: 'Bob'},
{id: 2, name: 'Sue' },
{id: 3, name: 'Mary', household_id: 2 },
{id: 4, name: 'Elizabeth', household_id: 6},
{id: 5, name: 'Tom'},
{id: 6, name: 'Jill'},
{id: 7, name: 'John', household_id: 6}
])
const householders = householdMembers(censusMembers)
console.log(householders(6))
//=> [
// {id: 4, name: 'Elizabeth','household_id': 6},
// {id: 7, name: 'John', 'household_id': 6}
// ]
console.log(householders(7)) //=> null
console.log(householders(8)) //=> null
console.log(householders(5)) //=> []
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.js"></script>
但是我建议您可能要重新考虑这个API。如果什么也没找到,则空数组是一个完全合理的结果。在某些情况下,使其返回null
会使输出更加难以使用。例如,如果您要检索家庭成员的姓名列表,则只需写const householderNames = pipe(householders, prop('name'))
。或者,如果您的函数始终返回列表,则可以执行此操作。
只有一个函数可以返回多个类型,这很难理解,也很难维护。请注意以下版本要简单得多,它总是返回一个(可能为空)列表:
const members = curry((census, id) => filter(propEq('household_id', id), census))