0

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

5
  • What have you tried so far? What doesn't work with your approach? Any errors? Please add a minimal reproducible example that shows the actual problem(s) in the question itself Commented Dec 16, 2019 at 14:59
  • I've added what I've tried so far, thanks Commented Dec 16, 2019 at 15:01
  • 1
    Honestly this data set is horrible and makes 0 sense - so much duplicated data Commented Dec 18, 2019 at 15:17
  • Thanks for the comment, variants array are actually products, each one is unique so it needs it's own set of options. Apart from this there are so many other things that are different from parent product. Can you propose a better structure? Commented Dec 18, 2019 at 15:22
  • 1
    more of 400 lines of JSON is a minimal example ? Commented Dec 20, 2019 at 0:07

2 Answers 2

2
+50

Honestly, this data structure needs reworking - it makes 0 sense what is what ID wise and ID's are duplicated in so many places it gets confusing fast.

But i think i have managed to sort it. First you filter the options values to match variants which you filter to their values and check ID's match. function is at the bottom. I used JSON trick to deep clone the object so i didn't touch the original object.

const 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
      }
    ]
  }
];

const 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
        }
      }
    ]
  }
];

const tmp = options.map(option => {
  let newEle = JSON.parse(JSON.stringify(option));
  let newValues = option.values.filter(value => {
    if (
      variants.filter(
        vari =>
          vari.options.filter(opt => opt.value._id === value._id).length >
          0
      ).length > 0
    ) {
      return true;
    }
    return false;
  });
  newEle.values = newValues;
  return newEle;
});

console.log(tmp);

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks Deckerz, I'll check it out and come back.
1

You can use filter and some methods:

const result = options.filter(f => 
     f.values.some(s=> variants.some(v1 => 
          v1.options.some(v2 => v2.value.value == s.value))));

A example:

const 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
        }
      ]
    }
  ]

  const 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
        }
      }
    ]
  }
]

const result = options.filter(f => f.values.some(s=> variants.some(v1 => v1.options.some(v2 => v2.value.value == s.value))));

console.log(result);

1 Comment

Thanks for the answer but the values are still there, I need to filter out values too (not only options) to only contain the matched options/values from variants array.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.