数组上的ramda函数javascript

时间:2018-10-25 19:08:26

标签: javascript ramda.js

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}
]

1 个答案:

答案 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))