J'ai ce JSON dans une variable de clients:
let customers = await query.offset(offset).limit(limit);
customers = customers.reduce((accumulator, item) => {
if (accumulator[item.id]) {
const group = accumulator[item.id];
group.suppliers = [];
group.suppliers.push({
id: item.supplier_id,
code: item.code,
title: item.title
});
} else {
accumulator[item.id] = item;
accumulator[item.id].suppliers = [];
accumulator[item.id].suppliers.push({
id: item.supplier_id,
code: item.code,
title: item.title
});
delete accumulator[item.id].supplier_id;
delete accumulator[item.id].code;
delete accumulator[item.id].title;
}
return accumulator;
}, {});
5 Réponses :
hi @RunnerPaul Dans votre code Tout est parfait, supprimez simplement la ligne group.suppliers = []; code> Ça fonctionnera selon vos attentes p>
Vous ne faites que réinitialiser la propriété code> fournisseurs code> chaque fois que l'accumulateur contient un élément avec le même identifiant que celui trouvé dans la matrice initiale. Le code correct est le suivant:
carte vous aidera à convertir vos données en format spécifié. La variable d'entrée supposante est des données.
data.customers.map(function(v){
v.suppliers=[
{
"supplier_id":v.supplier_id,
"title": v.title,
"code": v.code
}
]
delete v.supplier_id;
delete v.title;
delete v.code;
return v;
});
Cela crée 3 entrées avec ID: 7 code> qui n'est pas souhaité, une seule entrée doit exister.
Je préfère une boucle ici au lieu de Réduire code>. Pour éviter les doublures, une matrice de type HASHTABLE est utilisée et toutes les machines à sous vide sont supprimées par la suite. let new_customers = [];
for (let c of customers)
{
new_customers[c.id] = {
id: c.id,
name: c.name,
email: c.email,
suppliers: customers.filter (x => x.id == c.id).map (y => ({
supplier_id: y.supplier_id,
title: y.title,
code: y.code
}))
}
}
new_customers = new_customers.filter (x => x != null);
Je pense que c'est une meilleure approche:
const normalicedCustomers = jsonCusto.customers
.filter(
(v, i, a) => a.indexOf(v) === i
)
.map(
c => ({
id: c.id,
name: c.name,
email: c.email,
suppliers: jsonCusto.customers
.filter(c2 => c2.id === c.id)
.map(
c2 => ({
supplier_id: c2.supplier_id,
title: c2.title,
code: c2.code
})
)
})
)
L'étape de filtrage antérieure ne fonctionne pas car les éléments sont différents, juste l'identifiant, le nom et le courrier électronique sont égaux. Par conséquent, les entrées avec ID: 7 code> existent 3 fois.
J'avais peur que cela se produise. En tout cas l'idée est comprise. Et ce filtre peut être changé par un unique de Lodash