通过使用ramda对所有其他项目进行测试来过滤数组

gos*_*eti 0 javascript arrays ramda.js

我想对自己进行过滤(以对数组中的所有其他项目进行测试):

const people = [{
  name: "James Cromwell",
  region: "Australia"
}, {
  name: "Janet April",
  region: "Australia"
}, {
  name: "David Smith",
  region: "USA"
}, {
  name: "Tracey Partridge",
  region: "USA"
}]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我想做的就是留给以下人员:

  • name以相同的字母开头
  • region 值是一样的

在这种情况下,结果将是:

[{
  name: "James Cromwell",
  region: "Australia"
}, {
  name: "Janet April",
  region: "Australia"
}]
Run Code Online (Sandbox Code Playgroud)

我一直在看结合做filterany但没有喜悦。我在这里使用ramda的决定是,我在现有的ramda compose函数中使用它来转换数据。

Ori*_*ori 5

通过从region和的第一个字母生成的关键字对元素进行分组name。拒绝任何长度为1的组,然后将其转换回具有R.value的数组并展平。

注意:此解决方案将返回多组“相同”的人。如果只需要一组,则可以采用第一组或最大一组,以此类推...而不是获取值并展平。

const { compose, groupBy, reject, propEq, values, flatten } = R

const fn = compose(
  flatten, // flatten the array - or R.head to get just the 1st group
  values, // convert to an array of arrays
  reject(propEq('length', 1)), // remove groups with 1 items
  groupBy(({ name: [l], region }) => `${region}-${l.toLowerCase()}`) // collect into groups by the requested key
)

const people = [{"name":"James Cromwell","region":"Australia"},{"name":"Janet April","region":"Australia"},{"name":"David Smith","region":"USA"},{"name":"Tracey Partridge","region":"USA"}]

const result = fn(people)

console.log(result)
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>
Run Code Online (Sandbox Code Playgroud)