【问题标题】:Filter data based on nested array item using lodash使用 lodash 基于嵌套数组项过滤数据
【发布时间】:2019-08-15 14:20:53
【问题描述】:

我有以下数据,无法过滤

{
  "data": {
    "Viewer": {
      "CampaignGrids": {
        "edges": [
          {
            "node": {
              "Name": "mega campaign",
              "Start_Date": "08/31/2020",
              "End_Date": "09/15/2020",
              "Promoted_Titles": [
                {
                  "Primary_ISBN": "4314323211",
                  "Book": null
                },
                {
                  "Primary_ISBN": "94232344",
                  "Book": null
                },
                {
                  "Primary_ISBN": "221235345",
                  "Book": null
                }
              ]
            }
          },
          {
            "node": {
              "Name": "InActiveBook Campaign",
              "Start_Date": "08/14/2019",
              "End_Date": "08/14/2019",
              "Promoted_Titles": [
                {
                  "Primary_ISBN": "9781504011815",
                  "Book": {
                    "Primary_ISBN": "9781504011815",
                    "Active": true
                  }
                },
                {
                  "Primary_ISBN": "9780795336874",
                  "Book": {
                    "Primary_ISBN": "9780795336874",
                    "Active": true
                  }
                },
                {
                  "Primary_ISBN": "9781453244517",
                  "Book": {
                    "Primary_ISBN": "9781453244517",
                    "Active": true
                  }
                },
                {
                  "Primary_ISBN": "9781781892527",
                  "Book": {
                    "Primary_ISBN": "9781781892527",
                    "Active": false
                  }
                }
              ]
            }
          }
        ]
      }
    }
  }
}

我需要过滤所有包含 Active : False book 的广告系列

所以基于以上数据,我需要重新关注

{"node": {
              "Name": "InActiveBook Campaign",
              "Start_Date": "08/14/2019",
              "End_Date": "08/14/2019",
              "Promoted_Titles": [
                {
                  "Primary_ISBN": "9781504011815",
                  "Book": {
                    "Primary_ISBN": "9781504011815",
                    "Active": true
                  }
                },
                {
                  "Primary_ISBN": "9780795336874",
                  "Book": {
                    "Primary_ISBN": "9780795336874",
                    "Active": true
                  }
                },
                {
                  "Primary_ISBN": "9781453244517",
                  "Book": {
                    "Primary_ISBN": "9781453244517",
                    "Active": true
                  }
                },
                {
                  "Primary_ISBN": "9781781892527",
                  "Book": {
                    "Primary_ISBN": "9781781892527",
                    "Active": false
                  }
                }
              ]
            }
            }

目前我正在使用 lodash 库过滤器选项。我尝试关注,但它返回了两个数据而不是一个

  let flaged = _.filter(campaigns, function(item) {
	return _.filter(item.Promoted_Titles, function(o) {
	    return o.Book.Active = false;	
	})
  });		    

  console.log('flagged campaign ', JSON.stringify(flaged) , '\n');

我也试过了

let flaged = filter(campaigns, function(el) {
     el.Promoted_Titles = filter(el.Promoted_Titles, function(item) {
       console.log('item is ', item);		    
       return 'Book.Active' == false
     })	  
     return el;
   })

但在这两种情况下,我都得到了两个项目而不是一个。提前致谢

【问题讨论】:

  • 所以您希望过滤给定广告系列中的广告系列或图书?看起来您有一个活动数组和一个嵌套的书籍数组,那么您是否要过滤没有活动书籍的活动?或至少 1 本书?
  • 我正在尝试过滤至少有一本非活动图书的广告系列
  • o.Book.Active = false 是赋值,不是相等检查,'Book.Active' == false 总是false,嵌套两个_.filter() 调用总是会导致外部回调返回一个真实值(即实际上是外部数组的浅拷贝)

标签: javascript lodash


【解决方案1】:

您可以使用 Lodash 通过在 callback object 中定义匹配结构来做到这一点,如下所示:

let d = {"data":{"Viewer":{"CampaignGrids":{"edges":[{"node":{"Name":"mega campaign","Start_Date":"08/31/2020","End_Date":"09/15/2020","Promoted_Titles":[{"Primary_ISBN":"4314323211","Book":null},{"Primary_ISBN":"94232344","Book":null},{"Primary_ISBN":"221235345","Book":null}]}},{"node":{"Name":"InActiveBook Campaign","Start_Date":"08/14/2019","End_Date":"08/14/2019","Promoted_Titles":[{"Primary_ISBN":"9781504011815","Book":{"Primary_ISBN":"9781504011815","Active":true}},{"Primary_ISBN":"9780795336874","Book":{"Primary_ISBN":"9780795336874","Active":true}},{"Primary_ISBN":"9781453244517","Book":{"Primary_ISBN":"9781453244517","Active":true}},{"Primary_ISBN":"9781781892527","Book":{"Primary_ISBN":"9781781892527","Active":false}}]}}]}}}}

let e = d.data.Viewer.CampaignGrids.edges;
let a = _.filter(e, { node: { Promoted_Titles: [{ Book: { Active: false } }] } });

console.log(a);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>

【讨论】:

    【解决方案2】:

    您有一个名为 edges 的对象键,它是您的节点数组。

    const results = edges.filter( edge => {
      return edge.node.Promoted_Titles.filter( promotedTitles => promotedTitles.Book.Active === false).length > 0)
    });
    

    这将返回包含至少 1 本书的边缘列表。

    编辑:我只是将其交换以显示边缘/广告系列的列表,其中每个 cmets 至少有 1 本书处于非活动状态。

    【讨论】:

      猜你喜欢
      • 2017-09-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-15
      • 2019-04-14
      • 1970-01-01
      • 1970-01-01
      • 2021-02-21
      • 1970-01-01
      相关资源
      最近更新 更多