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

问题描述 投票:0回答:2

我有一系列的人,我想过滤自己(以测试数组中的所有其他项目):

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

在这种情况下我想做的是留下任何人:

  • namestarts用同一封信
  • region的价值是一样的

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

[{
  name: "James Cromwell",
  region: "Australia"
}, {
  name: "Janet April",
  region: "Australia"
}]

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

javascript arrays ramda.js
2个回答
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)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>

-1
投票

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

let output = people
    .filter((p1, i1) =>
        people.some((p2, i2) =>
            i1 !== i2 && p1.region === p2.region && p1.name[0] === p2.name[0]));

console.log(output);
© www.soinside.com 2019 - 2024. All rights reserved.