Reputation: 2009
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
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
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
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
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