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.keysn'est pas nécessaire puisque vous pouvez simplement utiliseritemdirectement (comme indiqué dans ma réponse).