【发布时间】:2021-02-01 19:13:34
【问题描述】:
import { createSelector } from 'reselect';
let exampleState = {
shop: {
matchingWord: "bmw",
cars: [
{ name: 'bmw', value: 130, comments: "expensive car" },
{ name: 'mercedes', value: 295, comments:"good looking" },
{ name: 'toyota', value: 95, comments:{ review: "bmw is better" } },
]
}
}
const filteredCarsSelector = createSelector(
(state) => state.shop.cars,
(state) => state.shop.matchingWord,
(cars, filters) =>
cars.filter((car) => {
return Object.values(car).some((word) => {
return typeof word === "string" && word.toLowerCase().includes(filters);
});
})
)
console.log(filteredCarsSelector(exampleState))
使用 reselect redux 库中的 createSelector,我试图过滤掉匹配单词的对象。所以在这个例子中,现在当我 console.log(filteredCarsSelector(exampleState)) 时,我得到[{ name: 'bmw', value: 130, comments: "expensive car" }],因为我的方法只检查顶级对象键并且不检查嵌套对象键,如“review”来查找匹配词,但我试图让两个对象都包含“bmw”,所以当我使用 console.log 时,我希望结果是这样的 [{ name: 'bmw', value: 130, comments:"expensive car"},{ name: 'toyota', value: 95, comments: {review: "bmw is better" }}] ,因为名称的值和评论的值都包含“bmw”。这里的技巧是审查键嵌套在 cmets 内。
有没有办法可以结合“car.name”和“car.cmets.review”来过滤掉包含匹配词的对象?这是codeandbox的链接:https://codesandbox.io/s/epic-glade-lls2w?file=/src/App.js
【问题讨论】:
标签: javascript reactjs redux react-redux