【问题标题】:Ramda: How can I filter data with nested objects?Ramda:如何使用嵌套对象过滤数据?
【发布时间】:2020-06-28 20:44:10
【问题描述】:
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 为 true 和 visibility 是我自己的值进行过滤。我怎样才能以有效的方式实现这一目标?非常感谢您对此的任何帮助。

到目前为止,我只能使用单个属性进行过滤

  R.filter(R.propEq("published", false))(articles);

【问题讨论】:

    标签: javascript ramda.js


    【解决方案1】:

    类似这样的:

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

    【讨论】:

    • 是的,如果您需要两个以上的谓词,请使用R.allPass 代替R.and
    • 不应该是both而不是and吗? R.and 似乎不接受谓词 ramdajs.com/docs/#and
    • 刚刚仔细检查,可以确认当前的实现不起作用。 @mzedeler 你能复习一下吗?
    • 我从不高兴 Ramda 使用 andor 相当于 &&||。在很多方面,我宁愿他们扮演 botheither 现在的角色。
    • 对不起,伙计们。固定!
    【解决方案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>

    【讨论】:

      猜你喜欢
      • 2018-11-18
      • 2020-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多