J'ai un tableau d'objets avec 4 propriétés pour chaque objet, comme ceci :

let arr = [
{name: john, lastName: smith, counter:1, city: New York}
{name: john, lastName: smith, counter:1, city: New York}
{name: emilio, lastName: kouri, counter:1, city: euy}
{name: john, lastName: smith, counter:1, city: New York}
]

Je veux le réduire pour qu'il retourne ça (somme le compteur)

[{name: emilio, lastName: kouri, counter:1, city: euy}
{name: john, lastName: smith, counter:3, city: New York}]

C'est le code que j'utilise en ce moment, et il le réduit correctement mais ne renvoie que [compteur, nom], je veux qu'il renvoie les quatre propriétés de chaque objet, comment faire ?

  let counts = arr.reduce((prev, curr) => {
    let count = prev.get(curr.name) || 0;

      prev.set(curr.name, curr.counter + count);
        return prev;
    }, new Map());


      let reducedObjArr = [...counts].map(([key, value]) => {
        return {key, value}
      })
    console.log('reducido',reducedObjArr); 
0
Sven Brodersen 19 mars 2019 à 01:15

2 réponses

Meilleure réponse

Vous n'avez besoin que d'une seule instruction reduce sans instructions map imbriquées :

let arr = [{
  name: "john",
  lastName: "smith",
  counter: 1,
  city: "New York"
}, {
  name: "john",
  lastName: "smith",
  counter: 1,
  city: "New York"
}, {
  name: "emilio",
  lastName: "kouri",
  counter: 1,
  city: "euy"
}, {
  name: "john",
  lastName: "smith",
  counter: 1,
  city: "New York"
}];

let counts = arr.reduce((acc, curr) => {
  if (!acc.some(({ name }) => name == curr.name)) {
    acc.push(curr);
  } else {
    acc.find(({ name }) => name == curr.name).counter++;
  }
  return acc;
}, []);

console.log(counts);
0
Jack Bashford 18 mars 2019 à 22:24

Vous pouvez prendre une copie de l'objet avec un nombre de zéro et incrémenter cet objet et définir cet objet.

let arr = [{ name: 'john', lastName: 'smith', counter: 1, city: 'New York' }, { name: 'john', lastName: 'smith', counter: 1, city: 'New York' }, { name: 'emilio', lastName: 'kouri', counter: 1, city: 'euy' }, { name: 'john', lastName: 'smith', counter: 1, city: 'New York' }];

let counts = arr.reduce((prev, curr) => {
    let item = prev.get(curr.name) || Object.assign({}, curr, { counter: 0 });
    item.counter += curr.counter;
    return prev.set(curr.name, item);
}, new Map);

let reducedObjArr = [...counts.values()]

console.log('reducido', reducedObjArr);
0
Nina Scholz 18 mars 2019 à 22:24