Ramda:如何使用嵌套对象过滤数据?

4
const articles = [
    {title: 'title 1', published: false, pages: 30, tags: {name: 'work', id: 1, visibility: "everyone"}},
    {title: 'title 2', published: false, pages: 25, tags: {name: 'home', id: 3, visibility: "myself"}},
    {title: 'title 3', published: true, pages: 30, tags: {name: 'vacation', id: 5, visibility: "myself"}}
];

我的JSON数据大致如下,我需要根据published为真且visibility是自己的值进行过滤。如何以有效的方式实现这一点?感谢您的帮助。
到目前为止,我只能使用单个属性进行过滤。
  R.filter(R.propEq("published", false))(articles);
2个回答

4

类似这样:

R.filter(
  R.allPass([
    R.propEq("published", false),
    R.pathEq(["tags", "visibility"], "myself")
  ])
)(articles);

1
是的,如果你需要超过两个谓词,可以使用 R.allPass 代替 R.and - Scott Sauyet
1
应该是both而不是and吗? R.and似乎不能接受谓词。https://ramdajs.com/docs/#and - Hitmands
1
刚刚仔细检查了一遍,确认当前的实现方式不起作用。@mzedeler,你能否请审核一下? - Hitmands
我从来不喜欢Ramda使用andor来代替&&||。在很多方面,我更希望它们扮演botheither现在所扮演的角色。 - Scott Sauyet
抱歉,各位。已修复! - mzedeler

2
您可以使用一个规范对象:

const predicate = R.where({
  published: R.equals(true),
  tags: R.where({
    visibility: R.equals('myself'),
  }),
});


// ==

const data = [
  {title: 'title 1', published: false, pages: 30, tags: {name: 'work', id: 1, visibility: "everyone"}},
  {title: 'title 2', published: false, pages: 25, tags: {name: 'home', id: 3, visibility: "myself"}},
  {title: 'title 3', published: true, pages: 30, tags: {name: 'vacation', id: 5, visibility: "myself"}}
];

console.log(
  R.filter(predicate, data),
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js" integrity="sha256-buL0byPvI/XRDFscnSc/e0q+sLA65O9y+rbF+0O/4FE=" crossorigin="anonymous"></script>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接