1
votes

Supprimer la virgule du dernier résultat dans la boucle forEach imbriquée

J'essaye de renvoyer les valeurs suivantes à insérer dans une instruction SQL:

let values = '';

Object.keys(body).forEach(key => {
  Object.keys(body[key]).forEach(item => {
    values += `('${body[key][item]}', '${key}', '${email}'),`;
  });
});

Voici les données avec lesquelles je dois travailler:

const email = "john@gmail.com";
const body = {
        "fruit": ["apple"],
        "vegetables": ["carrot", "beans"],
        "dairy": ["milk", "cheese"]
}; 


3 commentaires

Ajoutez des chaînes à un tableau de chaînes, puis utilisez array.join (',') pour éviter d'avoir à écrire l'instruction if pour détecter si la virgule doit être insérée.


@JasonAller Ouais, c'est probablement le moyen le plus propre ici


Le deuxième Object.keys n'est pas nécessaire puisque vous pouvez simplement utiliser item directement (comme indiqué dans ma réponse).


4 Réponses :


2
votes

Vous pouvez utiliser la fonction slice () pour supprimer le dernier caractère de la chaîne.

const email = "john@gmail.com";
const body = {
        "fruit": ["apple"],
        "vegetables": ["carrot", "beans"],
        "dairy": ["milk", "cheese"]
}; 
let values = Object.entries(body)
                      .flatMap(([k,v]) => v.map(a => `('${v}', '${k}', '${email}')`))
                      .join(',')
console.log(values)

La meilleure façon d'y parvenir est d'abord flatMap () pour obtenir un tableau plat de chaînes, puis d'utiliser join()

const email = "john@gmail.com";
const body = {
        "fruit": ["apple"],
        "vegetables": ["carrot", "beans"],
        "dairy": ["milk", "cheese"]
}; 
let values = '';
Object.keys(body).forEach(key => {
  Object.keys(body[key]).forEach(item => {
    values += `('${body[key][item]}', '${key}', '${email}'),`;
  });
});
values = values.slice(0,-1)

console.log(values)


0 commentaires

1
votes

J'utiliserais map / join:

const email = "john@gmail.com";
const body = {
  "fruit": ["apple"],
  "vegetables": ["carrot", "beans"],
  "dairy": ["milk", "cheese"]
}; 

const values = Object.keys(body)
	.map(key => 
		body[key]
		.map(item => `('${item}', '${key}', '${email}')`)
		.join(', ')
	)
	.join(', ');

console.log(values);


0 commentaires

0
votes

Vous pouvez modifier votre code afin qu'il n'ajoute la virgule que lorsque cela est nécessaire let values ​​= '';

let separator = '';
Object.keys(body).forEach(key => {
  Object.keys(body[key]).forEach(item => {
    values += `('${body[key][item]}', '${key}', '${email}')` + separator;
    separator = ',';
  });
});


0 commentaires

1
votes

Voici une autre approche qui utilise Array .reduce () sur Object.entries () de l'objet body :

.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
const email = "john@gmail.com";
const body = {
  "fruit": ["apple"],
  "vegetables": ["carrot", "beans"],
  "dairy": ["milk", "cheese"]
};

let res = Object.entries(body).reduce((acc, [k, v], i, arr1) =>
{
    v.forEach((e, j, arr2) =>
    {
        acc += `('${e}', '${k}', '${email}')`;
        acc += (i === arr1.length - 1 && j === arr2.length - 1) ? "" : ", ";
    });

    return acc;
}, "");

console.log(res);


0 commentaires