【问题标题】:How to filter array with filter settings?如何使用过滤器设置过滤数组?
【发布时间】:2018-10-13 21:40:59
【问题描述】:

我被数组、对象和过滤器困住了。我有以下代码,我想用我的过滤器设置过滤(数组)列表。然后用它做点什么。我使用 React 作为框架。但我认为这是纯 Javascript。

我的方向正确吗?

filterSettings = { flagA: false, flagB: true, FlagC: true};
        list = [
            {flag: a, txt: 'some text1'},
            {flag: a, txt: 'some text2'},
            {flag: b, txt: 'some text3'},
            {flag: b, txt: 'some text4'},
            {flag: c, txt: 'some text5'},
            {flag: c, txt: 'some text6'},
        ] 

        list.filter(
            // if(filtersettings.a === true) show flags with a 
            //else{hide flags with a}
            // if(filtersettings.b === true) show flags with b 
            //else{hide flags with b}
            ///...ect
        ).map((item)=>{
            console.log(item);
        });

【问题讨论】:

  • 你在另一个 SO 帖子上试过这个answer 吗?

标签: javascript arrays dictionary filter


【解决方案1】:

如果您使filterSettings 键与标志值对应,您可以使用filterSettings 值(它是一个布尔值)作为过滤器的测试:

let filterSettings = { a: false, b: true, c: true};
let list = [
    {flag: 'a', txt: 'some text1'},
    {flag: 'a', txt: 'some text2'},
    {flag: 'b', txt: 'some text3'},
    {flag: 'b', txt: 'some text4'},
    {flag: 'c', txt: 'some text5'},
    {flag: 'c', txt: 'some text6'},
] 

let filtered = list.filter( item => filterSettings[item.flag]) // filterSettings[item.flag] will be a boolean
console.log(filtered)

【讨论】:

    【解决方案2】:

    创建3个变量a,b,c来处理这三种情况然后使用filter()

    var a,b,c;
    var new_list = list.filter((item)=>{
        if(filterSettings.flagA==true && item.flag=="a")
        {
             return a.push(item);
        }
        else if(filterSettings.flagB==true && item.flag="b")
        {
             return b.push(item);
        }
       else(filterSettings.flagC==true && item.flag=="c")
       {
             return c.push(item);
       }
    }
    

    要获得最终结果,请使用 .length 属性检查哪个大于 0

    if (a.length>0){
        console.log(a)
    }
    else if (b.length>0){
        console.log(a)
    }
    else(c.length>0){
        console.log(a)
    }
    

    【讨论】:

    • a,b,c 是三个数组,分别保存每个案例
    【解决方案3】:

    您可以使用函数Array.prototype.filter 过滤特定对象,使用函数Array.prototype.forEach 循环过滤后的数组。

    我假设您不知道函数 Array.prototype.map 及其用途,因为您使用的方式将返回一个具有未定义值的数组

    const filterSettings = { a: false, b: true, c: true},
          list = [    {flag: 'a', txt: 'some text1'},    {flag: 'a', txt: 'some text2'},    {flag: 'b', txt: 'some text3'},    {flag: 'b', txt: 'some text4'},    {flag: 'c', txt: 'some text5'},    {flag: 'c', txt: 'some text6'}],
          handler = ({flag}) => filterSettings[flag];
    
    list.filter(handler).forEach(item=> console.log(item))
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多