I have an array with parent product options:
"options": [
{
"_id": "5ce3f95d35ad1e0999ee18db",
"sort_order": 0,
"values": [
{
"_id": "5ce3f95d35ad1e0999ee18dc",
"is_default": false,
"is_required": true,
"sort_order": 0,
"value": "",
"label": "No 6 / 38",
"option_id": "5ce3f95d35ad1e0999ee18db",
"__v": 0
},
{
"_id": "5ce3f95d35ad1e0999ee18dd",
"is_default": false,
"is_required": true,
"sort_order": 0,
"value": "",
"label": "No 6.5 / 39",
"option_id": "5ce3f95d35ad1e0999ee18db",
"__v": 0
},
{
"_id": "5ce3f95d35ad1e0999ee18de",
"is_default": false,
"is_required": true,
"sort_order": 0,
"value": "",
"label": "No 7 / 39.5",
"option_id": "5ce3f95d35ad1e0999ee18db",
"__v": 0
},
{
"_id": "5ce3f95d35ad1e0999ee18df",
"is_default": false,
"is_required": true,
"sort_order": 0,
"value": "",
"label": "No 7.5 / 40",
"option_id": "5ce3f95d35ad1e0999ee18db",
"__v": 0
},
{
"_id": "5ce3f95d35ad1e0999ee18e0",
"is_default": false,
"is_required": true,
"sort_order": 0,
"value": "",
"label": "No 8 / 41",
"option_id": "5ce3f95d35ad1e0999ee18db",
"__v": 0
},
{
"_id": "5ce3f95d35ad1e0999ee18e1",
"is_default": false,
"is_required": true,
"sort_order": 0,
"value": "",
"label": "No 8.5 / 41.5",
"option_id": "5ce3f95d35ad1e0999ee18db",
"__v": 0
},
{
"_id": "5ce3f95d35ad1e0999ee18e2",
"is_default": false,
"is_required": true,
"sort_order": 0,
"value": "",
"label": "No 9 / 42",
"option_id": "5ce3f95d35ad1e0999ee18db",
"__v": 0
},
{
"_id": "5ce3f95d35ad1e0999ee18e3",
"is_default": false,
"is_required": true,
"sort_order": 0,
"value": "",
"label": "No 9.5 / 42.5",
"option_id": "5ce3f95d35ad1e0999ee18db",
"__v": 0
},
{
"_id": "5ce3f95d35ad1e0999ee18e4",
"is_default": false,
"is_required": true,
"sort_order": 0,
"value": "",
"label": "No 10 / 43",
"option_id": "5ce3f95d35ad1e0999ee18db",
"__v": 0
},
{
"_id": "5ce3f95d35ad1e0999ee18e5",
"is_default": false,
"is_required": true,
"sort_order": 0,
"value": "",
"label": "No 10.5 / 44",
"option_id": "5ce3f95d35ad1e0999ee18db",
"__v": 0
},
{
"_id": "5ce3f95d35ad1e0999ee18e6",
"is_default": false,
"is_required": true,
"sort_order": 0,
"value": "",
"label": "No 11 / 44.5",
"option_id": "5ce3f95d35ad1e0999ee18db",
"__v": 0
},
{
"_id": "5ce3f95d35ad1e0999ee18e7",
"is_default": false,
"is_required": true,
"sort_order": 0,
"value": "",
"label": "No 11.5 / 45",
"option_id": "5ce3f95d35ad1e0999ee18db",
"__v": 0
},
{
"_id": "5ce3f95d35ad1e0999ee18e8",
"is_default": false,
"is_required": true,
"sort_order": 0,
"value": "",
"label": "No 12 / 46",
"option_id": "5ce3f95d35ad1e0999ee18db",
"__v": 0
},
{
"_id": "5ce3f95d35ad1e0999ee18e9",
"is_default": false,
"is_required": true,
"sort_order": 0,
"value": "",
"label": "No 12.5 / 46.5",
"option_id": "5ce3f95d35ad1e0999ee18db",
"__v": 0
},
{
"_id": "5ce3f95d35ad1e0999ee18ea",
"is_default": false,
"is_required": true,
"sort_order": 0,
"value": "",
"label": "No 13 / 47",
"option_id": "5ce3f95d35ad1e0999ee18db",
"__v": 0
}
],
"name": "ΥΠΟΔΥΣΗ | USA / EU ΜΕΓΕΘΗ 6/38 - 13/47",
"display_name": "Μέγεθος (USA / EU)",
"type": "text",
"display_style": "dropdown",
"__v": 0
},
{
"_id": "5df780dc603399b430e7b247",
"display_name": "swatch",
"display_style": "swatch",
"is_required": true,
"name": "Χρωματα",
"option_id": "",
"option_set_id": "",
"sort_order": 0,
"type": "swatch",
"values": [
{
"label": "Μονοκολορ",
"sort_order": 0,
"value": "",
"_id": "5df780dc603399b430e7b248"
},
{
"_id": "5df780ec603399b430e7b249",
"is_default": false,
"is_required": true,
"label": "Δικολορ",
"sort_order": 0,
"value": "#363030|#cd1bce",
"value_data": null
},
{
"_id": "5df780f7603399b430e7b24a",
"is_default": false,
"is_required": true,
"label": "Τρικολορ",
"sort_order": 0,
"value": "#33cfb0|#308464|#819bca",
"value_data": null
}
]
}
]
I also have this array of variants:
[{
"_id": "5df7812f136d32086e605bae",
"options": [
{
"option": {
"_id": "5ce3f95d35ad1e0999ee18db",
"sort_order": 0,
"display_name": "Μέγεθος (USA / EU)",
"type": "text",
"display_style": "dropdown"
},
"value": {
"_id": "5ce3f95d35ad1e0999ee18dc",
"is_default": false,
"is_required": true,
"sort_order": 0,
"value": "",
"label": "No 6 / 38",
"option_id": "5ce3f95d35ad1e0999ee18db",
"__v": 0
}
},
{
"option": {
"_id": "5df780dc603399b430e7b247",
"display_name": "swatch",
"display_style": "swatch",
"sort_order": 0,
"type": "swatch"
},
"value": {
"label": "Μονοκολορ",
"sort_order": 0,
"value": "",
"_id": "5df780dc603399b430e7b248"
}
}
],
},
{
"_id": "5df7812f136d32086e605bb2",
"options": [
{
"option": {
"_id": "5ce3f95d35ad1e0999ee18db",
"sort_order": 0,
"display_name": "Μέγεθος (USA / EU)",
"type": "text",
"display_style": "dropdown"
},
"value": {
"_id": "5ce3f95d35ad1e0999ee18dd",
"is_default": false,
"is_required": true,
"sort_order": 0,
"value": "",
"label": "No 6.5 / 39",
"option_id": "5ce3f95d35ad1e0999ee18db",
"__v": 0
}
},
{
"option": {
"_id": "5df780dc603399b430e7b247",
"display_name": "swatch",
"display_style": "swatch",
"sort_order": 0,
"type": "swatch"
},
"value": {
"_id": "5df780ec603399b430e7b249",
"is_default": false,
"is_required": true,
"label": "Δικολορ",
"sort_order": 0,
"value": "#363030|#cd1bce",
"value_data": null
}
}
],
},
{
"_id": "5df7812f136d32086e605bc3",
"options": [
{
"option": {
"_id": "5ce3f95d35ad1e0999ee18db",
"sort_order": 0,
"display_name": "Μέγεθος (USA / EU)",
"type": "text",
"display_style": "dropdown"
},
"value": {
"_id": "5ce3f95d35ad1e0999ee18e3",
"is_default": false,
"is_required": true,
"sort_order": 0,
"value": "",
"label": "No 9.5 / 42.5",
"option_id": "5ce3f95d35ad1e0999ee18db",
"__v": 0
}
},
{
"option": {
"_id": "5df780dc603399b430e7b247",
"display_name": "swatch",
"display_style": "swatch",
"sort_order": 0,
"type": "swatch"
},
"value": {
"label": "Μονοκολορ",
"sort_order": 0,
"value": "",
"_id": "5df780dc603399b430e7b248"
}
}
],
},
{
"_id": "5df7812f136d32086e605bcd",
"options": [
{
"option": {
"_id": "5ce3f95d35ad1e0999ee18db",
"sort_order": 0,
"display_name": "Μέγεθος (USA / EU)",
"type": "text",
"display_style": "dropdown"
},
"value": {
"_id": "5ce3f95d35ad1e0999ee18e6",
"is_default": false,
"is_required": true,
"sort_order": 0,
"value": "",
"label": "No 11 / 44.5",
"option_id": "5ce3f95d35ad1e0999ee18db",
"__v": 0
}
},
{
"option": {
"_id": "5df780dc603399b430e7b247",
"display_name": "swatch",
"display_style": "swatch",
"sort_order": 0,
"type": "swatch"
},
"value": {
"_id": "5df780ec603399b430e7b249",
"is_default": false,
"is_required": true,
"label": "Δικολορ",
"sort_order": 0,
"value": "#363030|#cd1bce",
"value_data": null
}
}
]
}
]
The options array of parent product has all possible variants the product can have, but the variants array has the variants that have stock greater that 0.
How I can alter/filter the options array of parent product to include only the option with the values coming from the variants array?
Example output: (if I had only No 6/38 size and #363030|#cd1bce in color from variants array)
"options": [
{
"_id": "5ce3f95d35ad1e0999ee18db",
"sort_order": 0,
"values": [
{
"_id": "5ce3f95d35ad1e0999ee18dc",
"is_default": false,
"is_required": true,
"sort_order": 0,
"value": "",
"label": "No 6 / 38",
"option_id": "5ce3f95d35ad1e0999ee18db",
"__v": 0
}
],
"name": "ΥΠΟΔΥΣΗ | USA / EU ΜΕΓΕΘΗ 6/38 - 13/47",
"display_name": "Μέγεθος (USA / EU)",
"type": "text",
"display_style": "dropdown",
"__v": 0
},
{
"_id": "5df780dc603399b430e7b247",
"display_name": "swatch",
"display_style": "swatch",
"is_required": true,
"name": "Χρωματα",
"option_id": "",
"option_set_id": "",
"sort_order": 0,
"type": "swatch",
"values": [
{
"label": "Μονοκολορ",
"sort_order": 0,
"value": "",
"_id": "5df780dc603399b430e7b248"
},
{
"_id": "5df780ec603399b430e7b249",
"is_default": false,
"is_required": true,
"label": "Δικολορ",
"sort_order": 0,
"value": "#363030|#cd1bce",
"value_data": null
}
]
}
]
This is what I've tried so far:
const tmpValues = new Set(
variants
.map(({ options }) => options.map((value) => value.value._id))
.flat()
);
const filteredOptions = options.filter(
({ values }) =>
values.every(
({ _id }) => tmpValues.has(_id)
)
);
I have prepped a playground here to make things easier: https://codesandbox.io/s/friendly-curie-9pz41