Ramda:如何使用嵌套对象过滤数据?
Ramda: How can I filter data with nested objects?
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);
像这样:
R.filter(
R.allPass([
R.propEq("published", false),
R.pathEq(["tags", "visibility"], "myself")
])
)(articles);
您可以使用规范对象:
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>
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);
像这样:
R.filter(
R.allPass([
R.propEq("published", false),
R.pathEq(["tags", "visibility"], "myself")
])
)(articles);
您可以使用规范对象:
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>