как сравнить массив объектов и массив вложенных объектов?

Я занимаюсь программированием совсем недавно и столкнулся со структурой данных, которую сложно понять. У меня есть функция, в которой я получаю массив объектов, представляющих продукты, добавленные в корзину.

  getAllAddedItems(addedItems) {

    this.fullInfoAddedItems.push(addedItems);
    const filtered = this.fullInfoAddedItems.reduce((filtered, item) => {
      if ( !filtered.some(filteredItem => JSON.stringify(filteredItem) === JSON.stringify(item)) ) {
        filtered.push(item);
      }
      return filtered;
    }, []);
    this.fullInfoAddedItems = filtered;
}


В результате я получаю следующий массив объектов

[
  {
    "price": 0,
    "functional_id": "carnet_de_conventions",
    "quantity": 3
  },
  {
    "price": 0,
    "functional_id": "depliants_services_incinération",
    "quantity": 4
  }
]

Проблема в том, что мне нужно "имя" данных, которое находится в массиве вложенных объектов, чтобы заполнить информацию о представлении.

Это будет структура массива

[

{
  "name": "Articles funeraires",
  "functional_id": "funeral",
  "generic": "incineris",
  "products": [
    {
      "file": "data:image/;base64,",
      "name": "Boîte de sympathie",
      "id": 27,
      "path": "",
      "items": [
        {
          "name": "1 boîte",
          "price": 0,
          "functional_id": "boite_de_sympathie_1_boite"
        }
      ]
    },
    {
      "file": "data:image/;base64,",
      "name": "Coffret empreinte rouge",
      "id": 8,
      "path": "",
      "items": [
        {
          "name": "Carton de 10 coffrets",
          "price": 140,
          "functional_id": "carton_de_10_coffrets_2_recharges_argile_offertes_coloris_rouge"
        }
      ]
    },
    {
      "file": "data:image/;base64,",
      "name": "AfuBOX",
      "id": 10,
      "path": "",
      "items": [
        {
          "name" : "PACK N°1 comprenant :",
          "price": 30,
          "functional_id": "afubox_6_petits_modeles
[
  {
    "price": 0,
    "functional_id": "carnet_de_conventions",
    "quantity": 3,
    "name": "Carnet de conventions"
  },
  {
    "price": 0,
    "functional_id": "depliants_services_incinération",
    "quantity": 4,
    "name": "Dépliants services de crémation"
  }
]

moyens_modeles", "quantity": 4 }, { "name" : "PACK N°2 comprenant :", "price": 70, "functional_id": "afubox_6_petits_modeles
[
  {
    "price": 0,
    "functional_id": "carnet_de_conventions",
    "quantity": 3,
    "name": "Carnet de conventions"
  },
  {
    "price": 0,
    "functional_id": "depliants_services_incinération",
    "quantity": 4,
    "name": "Dépliants services de crémation"
  }
]

moyens_modeles", "quantity": 6 } ] }, { "file": "data:image/;base64,", "name": "Catalogue d'urnes décoratives", "id": 20, "path": "", "items": [ { "price": 0, "functional_id": "catalogue_urnes_decoratives" } ] } ], "sorting": 2200 }, { "name": "Documents", "functional_id": "incineris_doc", "generic": "incineris", "products": [ { "file": "data:image/;base64,", "name": "Carnet de conventions", "id": 17, "path": "", "items": [ { "price": 0, "functional_id": "carnet_de_conventions", "quantity": 3 } ] }, { "file": "data:image/;base64,", "name": "Affiches procédure", "description": "De prise en charge et de crémation des animaux", "id": 18, "path": "", "items": [ { "price": 0, "functional_id": "affiches_procedure_de_prise_en_charge_et_de_cremation_des_animaux" } ] }, { "file": "data:image/;base64,", "name": "Dépliants services de crémation", "description": "Pour animaux de compagnie", "id": 19, "path": "", "items": [ { "price": 0, "functional_id": "depliants_services_incinération", "quantity": 4 } ] }, { "file": "data:image/;base64,", "name": "Catalogue d'urnes décoratives", "id": 20, "path": "", "items": [ { "price": 0, "functional_id": "catalogue_urnes_decoratives" } ] } ], "sorting": 2400 }, { "name": "Matériel crémation", "functional_id": "furniture", "generic": "incineris", "products": [ { "file": "data:image/;base64,", "name": "Sacs blancs", "description": "Pour les crémations Plurielles", "id": 11, "path": "", "items": [ { "name": "Petit modèle", "description": "Par 25", "price": 0, "functional_id": "sacs_blancs_pour_les_cremations_plurielles_petit_modele_par_25" }, { "name": "Moyen modèle", "description": "Par 20", "price": 0, "functional_id": "sacs_blancs_pour_les_cremations_plurielles_moyen_modele_par_20" }, { "name": "Grand modèle", "description": "Par 10", "price": 0, "functional_id": "sacs_blancs_pour_les_cremations_plurielles_grand_modele_par_10" } ] }, { "file": "data:image/;base64,", "name": "Sacs bordeaux", "description": "Pour les crémations Référence", "id": 12, "path": "", "items": [ { "name": "Petit modèle", "description": "Par 25", "price": 0, "functional_id": "sacs_bordeaux_pour_les_cremations_reference_petit_modele_par_10" }, { "name": "Grand modèle", "description": "Par 10", "price": 0, "functional_id": "sacs_bordeaux_pour_les_cremations_reference_grand_modele_par_10" } ] }, { "file": "data:image/;base64,", "name": "Sacs verts", "description": "Pour les crémations Privées", "id": 13, "path": "", "items": [ { "name": "Petit modèle", "description": "A l'unité", "price": 0, "functional_id": "sacs_verts_pour_les_cremations_privees_petit_modele_unite" }, { "name": "Moyen modèle", "description": "A l'unité", "price": 0, "functional_id": "sacs_verts_pour_les_cremations_privees_moyen_modele_unite" }, { "name": "Grand modèle", "description": "A l'unité", "price": 0, "functional_id": "sacs_verts_pour_les_cremations_privees_grand_modele_unite" } ] }, { "file": "data:image/;base64,", "name": "Sacs bleus", "description": "Pour pièces anatomiques", "id": 14, "path": "", "items": [ { "name": "Standard", "description": "Par 25", "price": 0, "functional_id": "sacs_bleus_pour_pieces_anatomiques_standard_par_25" } ] }, { "file": "data:image/;base64,", "name": "Etiquettes d'identification", "id": 15, "path": "", "items": [ { "name": "Standard", "description": "Par 50", "price": 0, "functional_id": "etiquettes_identification_et_colliers_de_serrages_standard_par_50" } ] }, { "file": "data:image/;base64,", "name": "Colliers de serrages", "id": 16, "path": "", "items": [ { "name": "Standard", "description": "Par 50", "price": 0, "functional_id": "distributeurs_pour_sacs_housse_par_5" } ] } ], "sorting": 2300 } ]
[
  {
    "price": 0,
    "functional_id": "carnet_de_conventions",
    "quantity": 3,
    "name": "Carnet de conventions"
  },
  {
    "price": 0,
    "functional_id": "depliants_services_incinération",
    "quantity": 4,
    "name": "Dépliants services de crémation"
  }
]

Я прикрепляю ссылку stacblitz, имитирующую то, что я пытаюсь сделать, чтобы сравнить по «functional_id», чтобы получить «имя» из массива вложенных объектов и нажать на первый массив

https://stackblitz.com/edit/angular-ivy-3wfgme

Кто-то, чтобы дать мне эффективный вариант, чтобы получить его. Заранее спасибо.

то, что я пытаюсь сделать, это пройти через второй массив, чтобы сравнить «functional_id» исходного продукта с «functional_id» продукта, добавленного в первый массив, поэтому я могу извлечь «имя» в первом массиве и нажать его в первый массив

this.market.forEach(function(item: any, i) {
      item.products.forEach(function(products: any, i) {
      products.items.forEach(function(sale: any, i) {
        let saleId = sale.functional_id;
        console.log(sale);
        console.log(saleId);

      });

      });
    });

Это то, что я пытаюсь сделать, но я не понимаю, как я могу сравнить два массива.


person homerThinking    schedule 29.05.2020    source источник
comment
Каков ожидаемый результат?   -  person Yousaf    schedule 29.05.2020
comment
@Yousaf Я только что отредактировал вопрос с вашим ответом: заранее спасибо   -  person homerThinking    schedule 29.05.2020
comment
@ javascript110899 ожидаемый результат должен быть только этими двумя объектами в массиве? За этим стоит какая-то конкретная логика?   -  person gorak    schedule 29.05.2020
comment
@gorak прогресс и разъяснения отредактированы   -  person homerThinking    schedule 29.05.2020
comment
@ javascript110899, вы должны в любом случае пройти через свой objects, затем сопоставить functionalid и получить product name, а затем добавить к object .   -  person gorak    schedule 29.05.2020


Ответы (1)


Выполните итерацию по массиву addedItems и для каждого элемента в этом массиве выполните итерацию по массиву products в каждом объекте внутри массива product и проверьте, имеет ли какой-либо элемент внутри текущего массива items значение functional_id, равное functional_id текущего элемента из массива addedItems.

getAllAddedItems(addedItems) {

  addedItems.forEach(item => {
     this.product.forEach(({products}) => {
        products.forEach(({name, items}) => {
           const index = items.findIndex(i => i.functional_id === item.functional_id);
           if (index > -1) item.name = name;
        })
     })
  })

  console.log(addedItems);
}

Вот демонстрация stackblitz. Откройте консоль, чтобы увидеть вывод функции

person Yousaf    schedule 29.05.2020
comment
Работает идеально! Я вижу, что делал это наоборот и гораздо более сложным способом... большое спасибо за ваше время и вашу помощь - person homerThinking; 29.05.2020