La méthode de réduction n'est pas facile, aidez-moi à résoudre ce problème.
J'ai besoin d'une fonction, qui reçoit un tableau avec n'importe quoi, et renvoie un objet avec des champs
{field1: true, field2:1, field3: 'wow', field4: 'you are smart, bro'}
comme dans l'exemple: Entrée:
[true,6,'wow','you are smart, bro']
Sortie:
{field1, field2, field3, field4}
5 Réponses :
Une solution qui utilise un objet . fromEntries
(navigateurs prenant en charge ECMAScript 2019 uniquement):
var arr = [true, 6, 'wow', 'you are smart, bro']; var result = arr.reduce(function(acc, cur, i) { acc['field' + (i + 1)] = cur; return acc; }, {}); console.log(result);
Une solution qui utilise Array.prototype.reduce et ECMAScript 2015:
const arr = [true, 6, 'wow', 'you are smart, bro']; const result = arr.reduce((acc, cur, i) => ({ ...acc, [(`field${i + 1}`)]: cur }), {}); console.log(result);
Et une solution qui utilise Array.prototype.reduce
et ECMAScript 5 (navigateurs aussi anciens que IE11):
const arr = [true, 6, 'wow', 'you are smart, bro']; const result = Object.fromEntries(arr.map((x, i) => [`field${i + 1}`, x])); console.log(result);
const arr = [true,6,'wow','you are smart, bro'] const obj = arr.reduce( (acc, rec, index) => ({ ...acc, [`field${index + 1}`]: rec }), {} ) console.log(obj)
Vous devez toujours vous rappeler que l'index commence à 0
const result = arr.reduce(f, {})
J'ai extrait la fonction de rappel dans la variable f
pour des raisons de lisibilité.
La fonction de rappel attend l'entrée suivante: accumulator acc
pour stocker les résultats, la valeur de l'élément traité en cours rec
et index
.
reduce(f, {})
L ' index
est facultatif mais nous devons quand même obtenir des index de tableau pour les utiliser dans les clés de notre objet résultant. Nous savons que le nombre d'index du tableau commence à 0
et non à 1
, nous devons donc ajouter + 1
au nombre pour obtenir field1
clé au lieu de field0
.
J'ai choisi d'utiliser l'interpolation de chaîne pour obtenir le résultat nécessaire:
acc[`field${index + 1}`] = rec
Ensuite, nous affectons l'élément de tableau correspondant à l'objet sous la clé que nous venons de construire:
`field${index + 1}`
La fonction de réduction attend l'entrée suivante: callback (function f
) et la valeur initiale, qui ici devrait être un objet vide {}
, car nous devons avoir un objet comme résultat.
const f = (acc, rec, index) => {...}
Nous créons maintenant une nouvelle variable result
qui sera la sortie de la fonction de réduction sur chaque élément du tableau arr code >:
const arr = [true,1,'wow','you are smart, bro'] const f = (acc, rec, index) => { acc[`field${index + 1}`] = rec // return acc } const result = arr.reduce(f, {}) console.log(result)
C'est toujours génial d'avoir une réponse, mais y compris une explication de la façon dont vous l'avez corrigé, c'est incroyable!
Merci pour le conseil @ mw509 Je viens de mettre à jour ma réponse et d'ajouter quelques explications.
const result = [true,6,'wow','you are smart, bro'] .reduce((acc, rec, i) => ({...acc, [`field${i + 1}`]: rec}),{}) console.log(result)
field1: true field2: 1 field3: "wow" field4: "you are smart, bro"
1 étape:
acc(3 elements) + field{3+1}: "you are smart, bro" | field1: true field2: 1 field3: "wow"
2 étape:
acc(2 elements) + field{2+1}: "wow" | field1: true field2: 1
3 étape:
acc(1 element) + field{1+1}: 1 | field1: true
4 étape:
acc(0 elements) + field{0+1}: true | accumulator is empty
fin:
const database = [true, 1, "wow", "you are smart, bro"]; const result = (arr) => arr.reduce( (acc, rec, i) => ({ ...acc, [`field${i + 1}`]: rec }), {} ); console.log(result(database));
pouvez-vous mettre en ligne ce que vous avez déjà essayé?