1
votes

JavaScript, réduisez. Besoin d'une fonction qui transforme le tableau en objet

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}


1 commentaires

pouvez-vous mettre en ligne ce que vous avez déjà essayé?


5 Réponses :


7
votes

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


0 commentaires

2
votes

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


0 commentaires

6
votes

Solution

const result = arr.reduce(f, {})

Explication

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)

2 commentaires

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.



1
votes

const result = [true,6,'wow','you are smart, bro']
.reduce((acc, rec, i) => ({...acc, [`field${i + 1}`]: rec}),{})


console.log(result)


0 commentaires

1
votes

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


0 commentaires