使用lodash过滤

时间:2019-09-19 07:09:23

标签: typescript redux react-redux lodash

我当前正在尝试对类型为ITests的测试列表执行筛选。我使用lodash来执行过滤,因为有人建议使用它来执行此任务。我的目标是选择测试后,该测试将过滤并显示相应的问题。我现在知道的当前过滤器不起作用,我尝试了许多不同的变体,但似乎无法获得合适的过滤器。任何帮助是极大的赞赏。我希望我的问题简洁明了,并且对于所提供的摘录也有意义。

下面是我的代码段:

这是我的listGroup中的代码,在这里我尝试根据selectedTests筛选问题。我尝试在测试和问题共享时寻找其moduleName的通用条目。

这是在我的ListGroup.tsx内部,过滤已在此处完成。

import * as React from "react";
import {
  UpdateSelectedTestType,
  UpdateSelectedTest
} from "../actions/TestActions";
import { ITestState } from "../models/ITestState";
import * as _ from "lodash";
interface IProps {
  onUpdatetoggleTestState: typeof UpdateSelectedTestType;
  toggleTestState: ITestState;
  onUpdateSelectedTest: typeof UpdateSelectedTest;
}
export class ListGroup extends React.Component<IProps> {
  public render() {
    let question = null
    if(this.props.toggleTesttate.selectedTest !=  undefined)
      var selectedtest = this.props.toggleTestState.selectedTest.moduleName
      questions = this.props.toggleTestState.questions
      var filterquestions = _.filter(questions, function(o){
        return _.isMatch(o, selectedtest )
      })
     console.log(filterquestion)
    return (
    );
  }
}

这是我的toggleButtonReducer.ts

const initialState: ITestState = {
  testype: TestType.test1,
  tests: dbTest,
  questions: dbQuestions,
  selectedTest: undefined
  //selectedQuestion: undefined
};

测试和问题共享一个名为moduleName的公共条目,因此,我将使用此字段基于所选测试访问已过滤的问题。

这是我的testActions.ts

export interface ITest {
  name: string;
  moduleName: string;
  testType: TestType


 export interface ITest {
      name: string;
      moduleName: string;

1 个答案:

答案 0 :(得分:1)

JavaScript现在具有内置的数组过滤功能,可能具有更简单的API。它需要一个回调,该回调具有传递给它的元素,索引和原始数组,并且您可以根据需要接收任意数量的

[edit]添加了检查selectedTest是否为模块名称数组

let selectedtest = this.props.toggleTestState.selectedTest.moduleName
let questions = this.props.toggleTestState.questions
let filteredQuestions = questions.filter(
  question => {
    if (Array.isArray(selectedTest) {
      return selectedTest.includes(question.moduleName);
    } else {
      return question.moduleName === selectedTest;
    }
  }
);