kyserslick
kyserslick

Reputation: 591

filter an array on object keys not empty

I'm trying to filter an array of objects by an object keys that have a value not empty

var collection = [
                      {
            "season": "ETE 18",
            "group": "GRBABY",
            "market": "ALL",
            "department": "ALL",
            "skuType": "ALL",
            "orderType": "ASE",
            "packagingType": "CI"
        },
        {
            "season": "ETE 18",
            "group": "MEN",
            "market": "ALL",
            "department": "ALL",
            "skuType": "ALL",
            "orderType": "ASE",
            "packagingType": "CI"
        },
        {
            "season": "ETE 18",
            "group": "GRBABY",
            "market": "NONE",
            "department": "ALL",
            "skuType": "ALL",
            "orderType": "ASE",
            "packagingType": "CI"
        },
                     ]

      var filterList = {season: "", group: "GRBABY", market: "ALL", department: "", 
          skuType: ""}

      var result = _.filter(collection , proPack => {
                          if (filterList.group !== '') {
                              return proPack.group === filterList.group;
                          } else {
                              return proPack;
                          }
                    });
                    
                    console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

This works for me for one filter but I'm unable to find a way to filter for all other keys when they have a value.

the result shoud be :

result = [
              {
    "season": "ETE 18",
    "group": "GRBABY",
    "market": "ALL",
    "department": "ALL",
    "skuType": "ALL",
    "orderType": "ASE",
    "packagingType": "CI"
} ]

Upvotes: 2

Views: 650

Answers (2)

Slai
Slai

Reputation: 22876

You can remove the empty properties:

var collection = [{
    "season": "ETE 18",
    "group": "GRBABY",
    "market": "ALL",
    "department": "ALL",
    "skuType": "ALL",
    "orderType": "ASE",
    "packagingType": "CI"
  },
  {
    "season": "ETE 18",
    "group": "MEN",
    "market": "ALL",
    "department": "ALL",
    "skuType": "ALL",
    "orderType": "ASE",
    "packagingType": "CI"
  },
  {
    "season": "ETE 18",
    "group": "GRBABY",
    "market": "NONE",
    "department": "ALL",
    "skuType": "ALL",
    "orderType": "ASE",
    "packagingType": "CI"
  }
]

var filterList = {season: "", group: "GRBABY", market: "ALL", department: "", 
          skuType: ""}
          
var filterList = _.omitBy(filterList, _.isEmpty)   // { group: "GRBABY", market: "ALL" }

var result = _.filter(collection, filterList)

console.log(filterList, result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

Upvotes: 2

arbuthnott
arbuthnott

Reputation: 3819

I think this should do what you want. You are ignoring keys in your filterList with empty values right?

var collection = [
                      {
            "season": "ETE 18",
            "group": "GRBABY",
            "market": "ALL",
            "department": "ALL",
            "skuType": "ALL",
            "orderType": "ASE",
            "packagingType": "CI"
        },
        {
            "season": "ETE 18",
            "group": "MEN",
            "market": "ALL",
            "department": "ALL",
            "skuType": "ALL",
            "orderType": "ASE",
            "packagingType": "CI"
        },
        {
            "season": "ETE 18",
            "group": "GRBABY",
            "market": "NONE",
            "department": "ALL",
            "skuType": "ALL",
            "orderType": "ASE",
            "packagingType": "CI"
        },
                     ]

      var filterList = {season: "", group: "GRBABY", market: "ALL", department: "", 
          skuType: ""}

var doFilter = function(arr, filterObj) {
    return arr.filter(propack => {
        for (key in filterObj) {
            if (filterObj[key] && filterObj[key] !== propack[key]) {
                return false;
            }
        }
        return true;
    });
};

console.log(doFilter(collection, filterList));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

Upvotes: 1

Related Questions