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

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

我有一个初始对象数组

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

我想要的输出如下

[

{
      "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
                              }
                             ]
                   ]
  } 
]

简而言之,我需要做的是恢复由其 "functional_id" 标识的产品的所有信息,将原始 "quantity" 保留在第一个对象数组中

我正在尝试的方法不起作用,因为有一点不允许我访问嵌套对象数组开头的信息


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;
                        }
                    });
                });
            });
        });

有了这个,我只设法在 forEach 的 "item" 级别放入 "cart" 属性的每个对象,但我不知道如何安装所需的结构... 有人告诉我如何访问该数据并纠正我的初始方法 提前谢谢你

如果您预先知道嵌套的深度并且它不会改变,则无需递归即可完成。 (递归会提供更通用的解决方案):

  • 我通过创建购物车 lookupItems 对象(使用 reduce)来实现,以便稍后快速查找
  • 然后绘制市场地图
    • 然后映射产品
      • 然后过滤购物车 lookupItems 对象中的商品
    • 然后过滤掉其项目数组长度 == 0 的所有产品
  • 然后过滤掉产品数组长度 == 0 的任何市场

注意:你似乎有一个不一致的地方,我不得不修改你的购物车以获得预期的输出,特别是这个项目("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>

输出:

[
  {
    "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
          }
        ]
      }
    ]
  }
]

使用flatMap添加数量,过滤不匹配。使用解构来排除输出对象中不需要的属性。

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>

您可以获取一个对象,以便更快地访问 cart 中想要的 functional_id

要获得子集,您可以减少嵌套属性并使用所需部分构建新对象。

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

好的,刚刚更新:这已经过测试,现在应该可以工作了。 这将检查任何具有数组的 child,然后尝试将 object 从购物车匹配到每个嵌套。如果您不想匹配数量 - 请按照我在下面评论的那样替换我的功能

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);

输出:

[
  {
    "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
  }
]