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"] };
4 Réponses :
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)
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);
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 = ','; }); });
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);
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 utiliseritem
directement (comme indiqué dans ma réponse).