dan_boy
dan_boy

Reputation: 2009

How to find a value in a nested array based on another value?

I am working on nested array and try to find a value inside the nested array based on another value. I want to find the OptionCode of the currently active filters.

filters = [
      {
        FilterCode: "TourPrice",
        FilterName: "Tour Price",
        Options: [
          { Name: "Free", OptionCode: "Free", active: false, blocked: false },
          { Name: "Paid", OptionCode: "Paid", active: false, blocked: false },
          {
            Name: "Free and Paid",
            OptionCode: "FreeAndPaid",
            active: true, //Find OptionCode Here
            blocked: false,
          },
        ],
      },
      {
        FilterCode: "SortedBy",
        FilterName: "Sorted By",
        Options: [
          {
            Name: "Most Relevant",
            OptionCode: "MostRelevant",
            active: true, // Find OptionCode Here
            blocked: false,
          },
          {
            Name: "Latest Tour",
            OptionCode: "LatestTour",
            active: false,
            blocked: false,
          },
          {
            Name: "Oldest Tour",
            OptionCode: "OldestTour",
            active: false,
            blocked: false,
          },
          {
            Name: "Lowest Price",
            OptionCode: "LowestPrice",
            active: false,
            blocked: false,
          },
        ],
      },
    ],

For the above array the expected outcome should be somthing like ["FreeAndPaid","MostRelevant"]

Upvotes: 0

Views: 47

Answers (4)

Greedo
Greedo

Reputation: 3549

You can use high order function: Reduce, Map and Filter for a clean one-line result:

let filters = [
      {
        FilterCode: "TourPrice",
        FilterName: "Tour Price",
        Options: [
          { Name: "Free", OptionCode: "Free", active: false, blocked: false },
          { Name: "Paid", OptionCode: "Paid", active: false, blocked: false },
          {
            Name: "Free and Paid",
            OptionCode: "FreeAndPaid",
            active: true, //Find OptionCode Here
            blocked: false,
          },
        ],
      },
      {
        FilterCode: "SortedBy",
        FilterName: "Sorted By",
        Options: [
          {
            Name: "Most Relevant",
            OptionCode: "MostRelevant",
            active: true, // Find OptionCode Here
            blocked: false,
          },
          {
            Name: "Latest Tour",
            OptionCode: "LatestTour",
            active: false,
            blocked: false,
          },
          {
            Name: "Oldest Tour",
            OptionCode: "OldestTour",
            active: false,
            blocked: false,
          },
          {
            Name: "Lowest Price",
            OptionCode: "LowestPrice",
            active: false,
            blocked: false,
          },
        ],
      },
    ];
    
    
 let output = filters.reduce((out, f) => out.concat(f.Options.filter(o => o.active).map(o => o.OptionCode)), []);
 
 console.log(output)

Upvotes: 1

Shubham Periwal
Shubham Periwal

Reputation: 2248

To build on Renu Yadav's answer: If you want to return OptionCodes only, add a .map() to get OptionCode from all the options:

const requiredOptionCodes = options.filter(option => option.active === true ).map((option) => {return option['OptionCode']})

Upvotes: 0

Emanuele
Emanuele

Reputation: 380

If every filter has an active option, you can use

console.log(filters.map(filter => filter.Options.find(option => option.active).OptionCode))

filters = [
      {
        FilterCode: "TourPrice",
        FilterName: "Tour Price",
        Options: [
          { Name: "Free", OptionCode: "Free", active: false, blocked: false },
          { Name: "Paid", OptionCode: "Paid", active: false, blocked: false },
          {
            Name: "Free and Paid",
            OptionCode: "FreeAndPaid",
            active: true, //Find OptionCode Here
            blocked: false,
          },
        ],
      },
      {
        FilterCode: "SortedBy",
        FilterName: "Sorted By",
        Options: [
          {
            Name: "Most Relevant",
            OptionCode: "MostRelevant",
            active: true, // Find OptionCode Here
            blocked: false,
          },
          {
            Name: "Latest Tour",
            OptionCode: "LatestTour",
            active: false,
            blocked: false,
          },
          {
            Name: "Oldest Tour",
            OptionCode: "OldestTour",
            active: false,
            blocked: false,
          },
          {
            Name: "Lowest Price",
            OptionCode: "LowestPrice",
            active: false,
            blocked: false,
          },
        ],
      },
    ]
console.log(filters.map(filter => filter.Options.find(option => option.active).OptionCode))

Upvotes: 2

Renu Yadav
Renu Yadav

Reputation: 149

1:- Get all options first 2:- Then you can filter options like this

const allOptions = filters.map(filter => (...filter.options) )

const requiredOptionCodes = options.filter(option => option.active === true )

Upvotes: 0

Related Questions