简体   繁体   English

如何通过比较值从嵌套对象数组中获取信息以创建另一个对象?

[英]How to get information from an array of nested objects to create another one by comparing values?

I have an initial object array我有一个初始 object 数组

cart = [
  {
    "functional_id": "carton_de_10_coffrets_2_recharges_argile_offertes_coloris_rouge",
    "quantity": 6
  },
  {
    "functional_id": "identification_et_colliers_de_serrages_standard_par_50",
    "quantity": 2
  },
  {
    "functional_id": "carnet_de_conventions",
    "quantity": 3
  }
]

which I need to compare with an array of nested objects, in which are the objects of the first array, to complete its information to display the view of the app我需要与嵌套对象数组进行比较,其中是第一个数组的对象,以完成其信息以显示应用程序的视图

the structure of the array of nested objects is as follows嵌套对象数组的结构如下

market =[

{
  "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_4_moyens_modeles",
          "quantity": 4
        },
        {
          "name" : "PACK N°2 comprenant :",
          "price": 70,
          "functional_id": "afubox_6_petits_modeles_4_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": "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
}
]

my desired output would be the following我想要的 output 将如下

[

{
      "name": "Articles funeraires",
      "products": [
                    "file": "data:image/;base64,",
                    "name": "Coffret empreinte rouge",
                    "path": "",
                    "items": [
                              {
                               "name": "Carton de 10 coffrets",
                               "price": 140,
                               "functional_id": "carton_de_10_coffrets_2_recharges_argile_offertes_coloris_rouge",
                               "quantity": 6
                              }
                             ]
                   ]
  } ,
{
      "name": "Matériel crémation",
      "products": [
                    "file": "data:image/;base64,",
                    "name": "Etiquettes d'identification",
                    "path": "",
                    "items": [
                              {
                               "name": "Standard",
                               "description": "Par 50",
                               "price": 0,
                               "functional_id": "identification_et_colliers_de_serrages_standard_par_50",
                               "quantity": 2
                              }
                             ]
                   ]
  } ,


    {
      "name": "Documents",
      "products": [
                    "file": "data:image/;base64,",
                    "name": "Carnet de conventions",
                    "path": "",
                    "items": [
                              {
                               "price": 0,
                               "functional_id": "carnet_de_conventions",
                               "quantity": 3
                              }
                             ]
                   ]
  } 
]

in short, what I need to do is to recover all the info of the product identified by its "functional_id" keeping the original "quantity" in the first array of objects简而言之,我需要做的是恢复由其“functional_id”标识的产品的所有信息,将原始“数量”保留在第一个对象数组中

What I'm trying doesn't work, because there comes a point where it doesn't let me access the information at the beginning of the nested object array我正在尝试的方法不起作用,因为它不允许我访问嵌套 object 数组开头的信息


cart.forEach(cartItem => {
            market.forEach(category => {
                category.products.forEach(product => {
                    product.items.forEach(item => {
                        if (cartItem.functional_id === item.functional_id) {
                            cartItem.subtitle = item.name;
                            cartItem.description = item.description;
                            cartItem.price = item.price;
                        }
                    });
                });
            });
        });

With this I only manage to put in each object of the "cart" properties at the "item" level in the forEach, but I don't see how to mount the desired structure... Someone to give me an idea of how to access that data and correct my initial approach Thank you in advance有了这个,我只设法在forEach的“项目”级别放入“购物车”属性的每个object,但我不知道如何安装所需的结构......有人给我一个如何访问该数据并更正我的初始方法 在此先感谢您

You can do it without recursion if you know how deep your nesting is up front, and it won't change.如果你知道你的嵌套有多深,你可以在没有递归的情况下做到这一点,并且它不会改变。 (Recursion would offer a more general solution): (递归将提供更通用的解决方案):

  • I do it by creating a cart lookupItems Object (with reduce) for fast lookups later我通过创建购物车lookupItems Object(带reduce)来实现,以便稍后快速查找
  • then map over markets然后 map 超过市场
    • then map over products然后 map 过产品
      • then filter items for those that are in the cart lookupItems Object然后过滤购物车中的项目 lookupItems Object
    • then filter any products out whose items array have length == 0然后过滤掉 items 数组长度 == 0 的任何产品
  • then filter any markets out whose products array have length == 0然后过滤掉产品数组长度 == 0 的任何市场

Note: you appear to have an inconsistency, I had to modify your cart to get the expected output, specifically this item ( "etiquettes_" was added to the front of the "functional_id" but in your market data it just starts with "indentification_..." ):注意:您似乎有不一致之处,我不得不修改您的购物车以获得预期的 output,特别是这个项目( "etiquettes_"已添加到"functional_id"的前面,但在您的市场数据中它只是以"indentification_..." ):

const cart = [
...,
  {
    "functional_id": "identification_et_colliers_de_serrages_standard_par_50",
    "quantity": 2
  },
...
];

 const lookupItems = cart.reduce((aggObj, item) => { aggObj[item['functional_id']] = item; return aggObj; }, {}); const output = markets.map(market => { market.products = market.products.map(prod => { prod.items = prod.items.filter(item => { if (lookupItems.hasOwnProperty(item['functional_id'])){ item.quantity = lookupItems[item['functional_id']].quantity; return true; } return false; }); return prod; }).filter(prod => prod.items.length >=1); return {name: market.name, products: market.products}; }).filter(market => market.products.length >=1); console.log(output);
 .as-console-wrapper { max-height: 100%;important: top; 0; }
 <script id="initData"> const cart = [ { "functional_id": "carton_de_10_coffrets_2_recharges_argile_offertes_coloris_rouge", "quantity": 6 }, { "functional_id": "identification_et_colliers_de_serrages_standard_par_50", "quantity": 2 }, { "functional_id": "carnet_de_conventions", "quantity": 3 } ]; const markets = [ { "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_4_moyens_modeles", "quantity": 4 }, { "name": "PACK N°2 comprenant:", "price": 70, "functional_id": "afubox_6_petits_modeles_4_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": "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 } ]; </script>

Output: Output:

[
  {
    "name": "Articles funeraires",
    "products": [
      {
        "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",
            "quantity": 6
          }
        ]
      }
    ]
  },
  {
    "name": "Documents",
    "products": [
      {
        "file": "data:image/;base64,",
        "name": "Carnet de conventions",
        "id": 17,
        "path": "",
        "items": [
          {
            "price": 0,
            "functional_id": "carnet_de_conventions",
            "quantity": 3
          }
        ]
      }
    ]
  },
  {
    "name": "Matériel crémation",
    "products": [
      {
        "file": "data:image/;base64,",
        "name": "Etiquettes d'identification",
        "id": 15,
        "path": "",
        "items": [
          {
            "name": "Standard",
            "description": "Par 50",
            "price": 0,
            "functional_id": "identification_et_colliers_de_serrages_standard_par_50",
            "quantity": 2
          }
        ]
      }
    ]
  }
]

Using flatMap to add quantity and filter out non-match.使用 flatMap 添加数量并过滤掉不匹配。 Using destructuring to exclude properties not wanted in the outputted object.使用解构来排除输出的 object 中不需要的属性。

 cartMap = {} cart.forEach(({ functional_id: id, quantity }) => cartMap[id] =,quantity || {quantity}) // true if undefined, else {quantity}. so I don't try to overwrite quantity if it isn't defined console.log( market,flatMap(({ name. products }) => { products = products,flatMap(({ id, items. ...o }) => { o.items = items.flatMap(item => { const quantity = cartMap[item?functional_id] return quantity. {..,item. ..:quantity }. [] }) return o.items?length > 0: o. [] }) return products?length > 0, { name: products } : [] }) )
 <head> <script> cart = [{ "functional_id": "carton_de_10_coffrets_2_recharges_argile_offertes_coloris_rouge", "quantity": 6 }, { "functional_id": "identification_et_colliers_de_serrages_standard_par_50", // is this a typo? //"etiquettes_identification_et_colliers_de_serrages_standard_par_50", "quantity": 2 }, { "functional_id": "carnet_de_conventions", "quantity": 3 } ] market = [ { "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_4_moyens_modeles", "quantity": 4 }, { "name": "PACK N°2 comprenant:", "price": 70, "functional_id": "afubox_6_petits_modeles_4_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": "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 } ] </script> </head>

You could take an object for having a faster access to the wanted functional_id of the cart .您可以使用 object 来更快地访问所需的cart functional_id ID。

For getting a subset, you could reduce nested properties and build new object with the wanted parts.为了获得子集,您可以减少嵌套属性并使用所需部件构建新的 object。

 var cart = [{ functional_id: "carton_de_10_coffrets_2_recharges_argile_offertes_coloris_rouge", quantity: 6 }, { functional_id: "identification_et_colliers_de_serrages_standard_par_50", quantity: 2 }, { functional_id: "carnet_de_conventions", quantity: 3 }], market = [{ 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_4_moyens_modeles", quantity: 4 }, { name: "PACK N°2 comprenant:", price: 70, functional_id: "afubox_6_petits_modeles_4_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: "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 }], cartObject = Object.fromEntries(cart.map(({ functional_id, quantity }) => [functional_id, quantity])), result = market.reduce((r, booth) => { var products = booth.products.reduce((s, product) => { var items = product.items.reduce((t, item) => { if (item.functional_id in cartObject) t.push({...item, quantity: cartObject[item.functional_id] }); return t; }, []); if (items.length) s.push({...product, items }); return s; }, []); if (products.length) r.push({...booth, products }); return r; }, []); console.log(result);
 .as-console-wrapper { max-height: 100%;important: top; 0; }

Ok just updated: This has been tested so should work now.好的,刚刚更新:这已经过测试,所以现在应该可以工作了。 This will check against any child which has an array then try to match the object from cart to each nest.这将检查任何具有数组的子节点,然后尝试将 object 从购物车匹配到每个巢穴。 If you dont want to match quantity - replace out my function as I've commented below如果您不想匹配数量 - 请替换我的 function,正如我在下面评论的那样

 const cart = [{ functional_id: "carton_de_10_coffrets_2_recharges_argile_offertes_coloris_rouge", quantity: 6 }, { functional_id: "identification_et_colliers_de_serrages_standard_par_50", quantity: 2 }, { functional_id: "carnet_de_conventions", quantity: 3 }]; const market = [{ 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_4_moyens_modeles", quantity: 4 }, { name: "PACK N°2 comprenant:", price: 70, functional_id: "afubox_6_petits_modeles_4_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: "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 }]; const isMatchKeys = (obj, cur, keys) => ( keys.every(key => ( obj[key] === cur[key] ))); const matchAllNested = (obj, arrNest, keys, parent = null) => ( Array.isArray(arrNest) && arrNest.reduce((accum, cur) => { const top = parent || cur; return accum || (isMatchKeys(obj, cur, keys) && top) || findInEachNested(obj, cur, keys, top); }, null) ); const findInEachNested = (obj, objNest, keys, parent) => ( Object.keys(objNest).reduce((accum, cur) => ( accum || Array.isArray(objNest[cur]) && matchAllNested(obj, objNest[cur], keys, parent) ), null) ); const finalArray = cart.map(obj => ( matchAllNested(obj, market, ['functional_id']) )); console.log(finalArray);

Output: Output:

[
  {
    "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_4_moyens_modeles",
            "quantity": 4
          },
          {
            "name": "PACK N°2 comprenant :",
            "price": 70,
            "functional_id": "afubox_6_petits_modeles_4_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": "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": "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
  },
  {
    "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
  }
]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何从一个对象数组中获取值到另一个对象数组中 - How to get values from one array of objects into another array of objects 如何从对象数组中的嵌套数组中获取数组值的组合 - How to get the combination of array values from nested arrays in an array of objects Ramda:通过与另一个数组中的每个项目进行比较,从数组中获取对象 - Ramda: get objects from array by comparing with each item in another array 从嵌套在另一个对象数组中的对象数组中访问值 - accessing values from an array of objects nested within another array of objects 如何从嵌套的对象数组中获取值 - React JS - How to get values from nested array of objects - React JS 如何从反应中的嵌套对象数组中获取计数值 - How to get count values from nested array of objects in react 如何根据另一个对象数组的值获取一个对象数组键的值? - how to get the values of one array of objects key based on values of another array of objects? 通过比较另一个数组中的值来过滤嵌套数组 - Filtering a nested array by comparing to the values in another array 根据另一个数组中的值删除嵌套对象数组中的值 - Remove values in nested array of objects based on values from another array 使用来自另一个对象的值创建一个对象数组 - Create an array of objects with values from another object
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM