2 votes

Comment fusionner des objets par valeur et modifier le type de propriété ?

J'ai ce tableau d'objets

[ { "value": "1", "hobbies": 'netflix'},{ "value": "1", "hobbies": 'food'} ]

J'en ai envie :

  1. Fusionner des objets par value attribut
  2. Remplacer la propriété hobbies par un tableau
  3. Fusionner les valeurs des propriétés

Le résultat attendu

[ { "value": "1", "hobbies": ['netflix','food']}]

2voto

Majed Badawi Points 17281

L'utilisation reduce est très utile ici car elle vous permet d'itérer sur le tableau et de conserver une valeur de accumulator pour stocker les données à chaque itération.

J'ai fixé le acc est un objet JSON (paires clé-valeur) dans lequel l'élément key est l'attribut de valeur et l'attribut value est l'élément résultant avec cette valeur.

En cours de route, s'il n'y a pas d'élément avec la clé donnée dans le fichier acc Nous ajoutons l'objet tel qu'il est en définissant hobbies comme un tableau au lieu d'une chaîne.

Sinon, s'il contient un tel objet, nous ajoutons sa valeur à l'objet existant, le hobbies liste.

Enfin, nous prenons la values de l'objet résultant qui donne la liste des objets groupés :

const arr = [ 
  { "value": "1", "hobbies": 'netflix'},
  { "value": "2", "hobbies": 'reading'},
  { "value": "1", "hobbies": 'food'},
];

const res = Object.values(
  arr.reduce((acc,item) => {
    const { value, hobbies } = item;
    acc[value] = acc[value] 
      ? { ...acc[value], hobbies: [...acc[value].hobbies, item.hobbies] } 
      : { ...item, hobbies: [hobbies] };
    console.log(acc);
    return acc;
  }, {})
);

console.log(res);

1voto

David Points 6605

Vous pouvez utiliser une boucle forEach pour parcourir le tableau.

var arr = [ { "value": "1", "hobbies": 'netflix'},{ "value": "1", "hobbies": 'food'} ];

var k = {};
var out = [];
arr.forEach(elm => {
  if(typeof(k[elm.value]) == "undefined")
    k[elm.value] = {value:elm.value, hobbies:[]};
  k[elm.value].hobbies.push(elm.hobbies);
});

Object.keys(k).forEach(key => out.push(k[key]));

console.log(out);

1voto

hev1 Points 6033

Vous pouvez utiliser Array#reduce avec un objet pour stocker le résultat pour chaque valeur. À chaque itération, si la valeur courante n'existe pas en tant que clé dans l'objet accumulateur, nous le créons et initialisons l'objet hobbies comme un tableau vide. Ensuite, nous ajoutons le hobby actuel à l'objet à cette valeur. Après l'ajout de la propriété reduce nous utilisons Object.values pour obtenir un tableau de toutes les valeurs obtenues.

const arr = [ { "value": "1", "hobbies": 'netflix'},{ "value": "1", "hobbies": 'food'} ];
const res = Object.values(
    arr.reduce((acc,{value, hobbies})=>
       ((acc[value] = acc[value] || {value, hobbies: []}).hobbies.push(hobbies), acc),
  {}));
console.log(res);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X