[英]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):
(递归将提供更通用的解决方案):
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.