0
votes

Réduire la fonction dans Node.js Application omettant les données JSON JSON et est trop encombrant

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


0 commentaires

5 Réponses :


2
votes

hi @RunnerPaul Dans votre code Tout est parfait, supprimez simplement la ligne group.suppliers = []; Ça fonctionnera selon vos attentes


0 commentaires

1
votes

Vous ne faites que réinitialiser la propriété fournisseurs 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: xxx


0 commentaires

0
votes

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


1 commentaires

Cela crée 3 entrées avec ID: 7 qui n'est pas souhaité, une seule entrée doit exister.



0
votes

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


0 commentaires

1
votes

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


2 commentaires

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