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