2 votes

Comment regrouper les identifiants d'un objet en double et supprimer un objet dans un tableau en utilisant javascript ?

Je veux supprimer les objets en double du tableau après avoir regroupé les identifiants des objets en double avec les identifiants des objets correspondants (déjà existants). Tout ce que j'ai essayé, c'est de regrouper les ID, mais je n'ai pas réussi à supprimer les objets en double du tableau.

Tableau original

        [
         {id:2,title:'men'},
         {id:3,title:'women'},
         {id:1,title:'kids'},
         {id:4,title:'sports'}, 
         {id:5, title:'women'},
         {id:6,title:'kids'}
       ];

Tableau prévu

 [
   { id: 2, title: 'men' },
   { id: [3,5], title: 'women' },
   { id: [1,6], title: 'kids' },
   { id: 4, title: 'sports' }
 ]

Essayé

let array = [{id:2,title:'men'},{id:3,title:'women'},{id:1,title:'kids'},
{id:4,title:'sports'}, {id:5, title:'women'},{id:6,title:'kids'}];

for(let i=0; i<array.length-1;i++){
    for(let j=i+1; j<array.length; j++){
        if(array[i].title===array[j].title)
         array[i]={id:[array[i].id, array[j].id], title: array[i].title}
    }
}
console.log(array)

Veuillez m'aider à obtenir le résultat escompté de manière plus efficace.

1voto

Majed Badawi Points 17281
const arr = [ {id:2,title:'men'}, {id:3,title:'women'}, {id:1,title:'kids'}, {id:4,title:'sports'}, {id:5, title:'women'}, {id:6,title:'kids'} ];

const res = [...
// iterate over arr while updating a Map
arr.reduce((map, item) => {
  const { id, title } = item;
  const prev = map.get(title);
  // if map already contains a record with this title as key, update id list
  if(prev) prev.id = Array.isArray(prev.id) ? [...prev.id, id] : [prev.id, id];
  // else create a new record
  else map.set(title, item);
  return map;
}, new Map)
// after getting the map of grouped items by title, return the values
.values()];

console.log(res);

1voto

Giorgi Points 4620
let items = [{
        id: 2,
        title: 'men'
    },
    {
        id: 3,
        title: 'women'
    },
    {
        id: 1,
        title: 'kids'
    },
    {
        id: 4,
        title: 'sports'
    },
    {
        id: 5,
        title: 'women'
    },
    {
        id: 6,
        title: 'kids'
    }
];

let dest = [];

items.forEach(x => {
    let find;
    if (find = dest.find(y => y.title === x.title)) {
        find.id = Array.isArray(find.id) ? [...find.id, x.id] : [find.id, x.id]
    } else {
        dest.push(x)
    }
})

console.log(dest)

1voto

Akhil Points 784

Il est plus facile de créer d'abord l'objet inverse avec { [title]: keys[] } en utilisant reduce puis le remettre en correspondance avec votre array

const input = [
  { id: 2, title: "men" },
  { id: 3, title: "women" },
  { id: 1, title: "kids" },
  { id: 4, title: "sports" },
  { id: 5, title: "women" },
  { id: 6, title: "kids" },
];

const output = input.reduce((acc, { id, title }) => {
  const val = acc[title];
  if (val) {
    acc[title] = Array.isArray(val) ? [...val, id] : [val, id];
  } else {
    acc[title] = id;
  }
  return acc;
}, {});

const result = Object.keys(output).map((key) => ({
  id: output[key],
  title: key,
}));

console.log(result);

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